TCP网络编程

// 服务器端

#include <stdio.h>  

#include <Winsock2.h> // windows socket的头文件  

#pragma commentlib"ws2_32.lib" ) // 链接Winsock2.h的静态库文件  

int main()

{

// 初始化winsocket

WORD wVersionRequested;

WSADATA wsaData;

wVersionRequested = MAKEWORD(2, 2); // 第一个参数为低位字节;第二个参数为高位字节  

// 对winsock DLL进行初始化,协商Winsock的版本支持,并分配必要的资源

int err = WSAStartup(wVersionRequested, &wsaData);

if (err != 0)

return 0;

 

// 创建socket。AF_INET表示在Internet中通信;SOCK_STREAM表示socket是流套接字,对应tcp;0指定网络协议为TCP/IP  

 SOCKET sockSrv = socket(AF_INETSOCK_STREAM, 0); 

 

SOCKADDR_IN  addrSrv;

// htonl用来将主机字节顺序转换为网络字节顺序(to network long)  INADDR_ANY就是指定地址为0.0.0.0的地址,  表示任意地址

addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 

addrSrv.sin_family = AF_INET;

// htons用来将主机字节顺序转换为网络字节顺序(to network short)  

addrSrv.sin_port = htons(4321);

 

// 将本地地址绑定到所创建的socket上,以使在网络上标识该socket  

 bind(sockSrv, (SOCKADDR*)&addrSrvsizeof(SOCKADDR));

 listen(sockSrv, 5); // socket监听,准备接受连接请求

 

SOCKADDR_IN addrClient;

int len = sizeof(SOCKADDR);

printf("我是服务器端, Welcome, I'm server!  — qzher.com\n\n");

 

while (1)

{

// 接受客户端的连接请求。addrClient包含了发出连接请求的客户机IP地址信息;返回的新socket描述服务器与该客户机的连接  

 SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);

 

char sendBuf[50];

// inet_ntoa网络地址转换转点分十进制的字符串指针  即 16777343  -> 127.0.0.1

sprintf(sendBuf"I'm Server, Welcome %s to here!",inet_ntoa(addrClient.sin_addr));

 send(sockConnsendBufstrlen(sendBuf) + 1, 0); // 发送数据

 

char recvBuf[50];

 recv(sockConnrecvBuf, 50, 0); // 接收服务器的数据

printf("—-服务器接到新的消息—-\n");

printf("客户端发来消息说:%s\n\n"recvBuf);

closesocket(sockConn);

Sleep(2000); //2000毫秒  

}

WSACleanup();

return 0;

}



// 客户端

#include <stdio.h>  

#include <Winsock2.h>  

#pragma commentlib"ws2_32.lib" )   

 

int main()

{

WORD wVersionRequested;

WSADATA wsaData;

 

wVersionRequested = MAKEWORD(2, 2); // 第一个参数为低位字节;第二个参数为高位字节  

 

int err = WSAStartup(wVersionRequested, &wsaData); 

if (err != 0)

return 0;

printf("我是客户端  I'm client — qzher.com\n\n");

 

for (int index = 0;  index<10; index++)

{

 SOCKET sockClient = socket(AF_INETSOCK_STREAM, 0);

 

// 服务器信息

SOCKADDR_IN addrClt;

// 服务器IP(本机) inet_addr将IP地址从点数格式转换成网络字节格式整型

addrClt.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");       

addrClt.sin_family = AF_INET;

addrClt.sin_port = htons(4321);// 连接服务器的端口,本机的端口由系统指定

 

// 客户端向服务器发出连接请求  

 connect(sockClient, (SOCKADDR*)&addrCltsizeof(SOCKADDR));

char recvBuf[50];

 recv(sockClientrecvBuf, 50, 0);

printf("—-客户端器接到新的消息—-\n");

printf("服务器说 : %s\n\n"recvBuf);

 

char sendBuf[50];

sprintf(sendBuf"%3d,"index);

strcat(sendBuf"你好,我是客户端  — qzher");

 send(sockClientsendBufstrlen(sendBuf) + 1, 0); // 向服务器发送数据

closesocket(sockClient);

Sleep(2000);

}

WSACleanup();

return 0;

}


 

我是服务器端, Welcome, I'm server!  — qzher.com

—-服务器接到新的消息—-

客户端发来消息说:  0,你好,我是客户端  — qzher

—-服务器接到新的消息—-

客户端发来消息说:  1,你好,我是客户端  — qzher

 

我是客户端  I'm client — qzher.com

—-客户端器接到新的消息—-

服务器说 : I'm Server, Welcome 127.0.0.1 to here!

—-客户端器接到新的消息—-

服务器说 : I'm Server, Welcome 127.0.0.1 to here!

发表评论

电子邮件地址不会被公开。 必填项已用*标注