1.服务器端代码
创建一个TCP的服务器端的程序需要调用的函数流程如下:1
WSAStartup()->socket()->bind()->listen()->accept()->send()/recv()->closesocket()->WSACleanup()
只要依次调用上面的函数即可。服务器端的代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2),&wsaData);
//创建套接字
SOCKET sListen = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//对sockaddr_in结构体填充地址、端口信息
struct sockaddr_in ServerAddr;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.S_un.S_addr = inet_addr("10.10.30.16");
ServerAddr.sin_port = htons(1234);
//绑定套接字与地址信息
bind(sListen, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
//端口监听
listen(sListen, SOMAXCONN);
//获取连接请求
sockaddr_in ClientAddr;
int nSize = sizeof(ClientAddr);
SOCKET sClient = accept(sListen, (SOCKADDR *)&ClientAddr, &nSize );
//输出客户端使用的IP地址和端口号
printf("ClientIP=%s:%d\r\n",inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port));
//发送消息
char szMsg[MAXBYTE] = {0};
lstrcpy(szMsg, "hello Client!\r\n");
send(sClient, szMsg,strlen(szMsg) + sizeof(char), 0 );
//接收消息
recv(sClient, szMsg,MAXBYTE, 0);
printf("Client Msg : %s \r\n",szMsg);
WSACleanup();
return 0;
}
这样一个服务器端的程序就完成了。为了起到演示的作用,不让多余的东西影响流程的清晰化,这里没有对API函数的返回值进行判断。在实际的开发中,为了保证程序的健壮性,应该对各函数的返回值进行判断。
在一个工作区下再新建一个项目的过程
PS:需要一定VC的基础,否则很可能会失败!
2.客户端代码
在客户端中同样也是调用前面介绍的API函数进行搭积木式的编程就可以了。客户端的代码调用API的流程如下:1
WSAStartup()->socket()->connect()->send()/recv()->closexocket()->WSACleanup()
客户端的代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2),&wsaData);
//创建套接字
SOCKET sServer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//对sockaddr_in结构体填充地址、端口信息
struct sockaddr_in ServerAddr;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.S_un.S_addr = inet_addr("10.10.30.16");
ServerAddr.sin_port = htons(1234);
//连接服务器
connect(sServer, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
char szMsg[MAXBYTE] = {0};
//接收消息
recv(sServer, szMsg, MAXBYTE, 0);
printf("Server Msg : %s \r\n", szMsg);
//发送消息
lstrcpy(szMsg, "hello Server!\r\n");
send(sServer, szMsg,strlen(szMsg) + sizeof(char), 0);
WSACleanup();
return 0;
}
效果如下所示: