#pragma comment(lib,"ws2_32.lib")//引入动态套接字的库文件#include<WinSock2.h>#include<stdio.h>#include<stdlib.h>voidmain(){
WSADATA wasDate;//WSADATA,一种数据结构。这个结构被用来存储被//WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。
SOCKET ListenSocket;//定义一个套接字,用于创建服务器的套接字
SOCKET NewConnect;//定义一个套接字,用于接收新连接的套接字int Ret;//此变量记录初始化返回值
SOCKADDR_IN ServerAddr;//定义一个地址变量存放服务器的地址
SOCKADDR_IN ClientAddr;//定义一个地址变量存放客户机的地址int Port =5150;//定义一个端口int ClientAddrLen;//定义一个int变量,用于记录客户机的地址长度char DataBuffer[1024];if((Ret =WSAStartup(MAKEWORD(2,2),&wasDate))!=0)//初始化套接字{printf("WSAStartup failed with error %d ",Ret);return;}if((ListenSocket =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))== INVALID_SOCKET)//创建套接字{printf("socket failed with error %d\n",WSAGetLastError());WSACleanup();return;}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port =htons(Port);//ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//设置绑定客户机的IP,使用INADDR_ANY表示可以接收任意IP
ServerAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.2");if(bind(ListenSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)//绑定服务器的套接字和客户机的地址{printf("bind failed with error %d\n",WSAGetLastError());closesocket(ListenSocket);WSACleanup();return;}if(listen(ListenSocket,5)== SOCKET_ERROR)//监听客户机连接{printf("listen failed with error %d\n",WSAGetLastError());closesocket(ListenSocket);WSACleanup();return;}printf("We are waiting a connection on port %d.\n",Port);printf("Listen(正在监听)...\n");
ClientAddrLen =sizeof(SOCKADDR);//接收客户机,返回客户机的套接字,建立新连接if((NewConnect =accept(ListenSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen))== INVALID_SOCKET){printf("accept failed with error %d\n",WSAGetLastError());closesocket(ListenSocket);WSACleanup();return;}printf("We successfully got a connection from %s:%d\n",inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port));closesocket(ListenSocket);//关闭服务器的套接字printf("We are waiting to receive data\n");if((Ret =recv(NewConnect,DataBuffer,sizeof(DataBuffer),0))== SOCKET_ERROR){printf("recv failed with error %d\n",WSAGetLastError());closesocket(ListenSocket);WSACleanup();return;}printf("We successfully received %d bytes.\n",Ret);
DataBuffer[Ret]='\0';printf("%s\n",DataBuffer);printf("We are new going to close the client connection.\n");closesocket(ListenSocket);WSACleanup();system("pause");}
客户机示例函数:
#pragma comment(lib,"ws2_32.lib")#include<WinSock2.h>#include<stdio.h>#include<stdlib.h>voidmain(){
WSADATA wsaData;//定义一个套接字初始化变量
SOCKET s;//定义一个客户机套接字变量int Ret;int Port =5150;
SOCKADDR_IN ServerAddr;//定义一个IP//1、初始化套接字if((Ret =WSAStartup(MAKEWORD(2,2),&wsaData))!=0){printf("WSAStartup failed with error %d\n",Ret);return;}//2、创建套接字if((s =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))== INVALID_SOCKET){printf("socket failed with error %d\n",WSAGetLastError());WSACleanup();return;}//3、根据服务器IP和端口连接服务器
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port =htons(Port);
ServerAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");printf("We are trying to connect to %s:%d...\n",inet_ntoa(ServerAddr.sin_addr),htons(ServerAddr.sin_port));if(connect(s,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR){printf("connect failed with error %d\n",WSAGetLastError());closesocket(s);WSACleanup();return;}printf("Our connection succeeded.\n");printf("We will now try to send a hello messgae.\n");//4、服务器连接成功之后,向服务器发送Helloif((Ret =send(s,"hello",5,0))== SOCKET_ERROR){printf("send failed with error %d\n",WSAGetLastError());closesocket(s);WSACleanup();return;}printf("we successfully sent %d bytes.\n",Ret);system("pause");}