2.2.1实例;基于TCP的通信

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
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "ws2_32")

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
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "ws2_32")

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;
}

效果如下所示:

本文标题:2.2.1实例;基于TCP的通信

文章作者:water

发布时间:2018年07月02日 - 11:36:47

最后更新:2018年07月02日 - 13:59:05

原始链接:http://9cat.top/2018/07/02/2-2-1实例-基于TCP的通信/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

------ 本文结束------
分享
分享