链接ws2_32.lib库
头文件#include <winsock2.h>
1 int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
初始化Winsock库
wVersionRequested:Winsock版本信息,用MAKEWORD宏构造,MAKEWORD(2,2)。
lpWSAData:WSADATA结构体变量的地址。无特殊含义,但是要传递结构体变量地址。
1 int WSACleanup();
注销Winsock相关库,成功返回0,失败返回SOCKET_ERROR。
1 SOCKET socket(int af, int type, int protocol);
成功返回套接字句柄,失败返回INVALID_SOCKET。
af:套接字中使用的协议族信息,常用的是PF_INET,IPv4互联网协议族。
type:套接字数据传输类型信息。有面向连接的套接字(SOCK_STREAM),面向消息的套接字(SOCK_DGRAM)。
protocol:计算机间通信中使用的协议信息。选择最终协议,IPv4网络协议族中面向连接的协议(IPPROTO_TCP),面向消息的协议(IPPROTO_UDP)。
1 int bind(SOCKET s, struct sockaddr * name, int namelen);
成功返回0,失败返回SOCKET_ERROR。
1 int listen(SOCKET s, int backlog);
成功返回0,失败返回SOCKET_ERROR。
1 SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);
成功返回套接字句柄,失败返回INVALID_SOCKET。
1 int connect(SOCKET s, struct sockaddr * name, int namelen);
成功返回0,失败返回SOCKET_ERROR。
1 int closesocket(SOCKET s);
关闭套接字,成功返回0,失败返回SOCKET_ERROR。
1 int send(SOCKET s,const char * buf, int len, int flags);
数据传输函数,成功返回传输字节数,失败返回SOCKET_ERROR。
s:数据传输对象连接的套接字句柄值。
buf:保存待传输数据的缓冲地址值。
len:要传输的字节数。
flags:传输数据时要用到的多种选项信息。
1 int recv(SOCKET s, const char * buf, int len, int flags);
成功时返回接受的字节数,收到EOF时为0,失败时返回SOCKET_ERROR。
s:数据接收对象连接的套接字句值。
buf:保存接收数据的缓冲地址值。
len:能够接受的最大字节数。
flags:接受数据时用到的多种选项信息。
1 #include <WinSock2.h> 2 #include <iostream> 3 4 namespace WinSock { 5 6 void ErrorHandling(char* message) { 7 std::cerr << message << std::endl; 8 exit(1); 9 } 10 11 int Server(int port) { 12 WSADATA wsaData; 13 SOCKET hServSock, hClntSock; 14 SOCKADDR_IN servAddr, clntAddr; 15 int szClntAddr; 16 char message[] = "Hello World!"; 17 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ErrorHandling("WSAStartup() error"); 18 hServSock = socket(PF_INET, SOCK_STREAM, 0); 19 if (hServSock == INVALID_SOCKET) ErrorHandling("socket() error"); 20 memset(&servAddr, 0, sizeof(servAddr)); 21 servAddr.sin_family = AF_INET; 22 servAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 23 servAddr.sin_port = htons(port); 24 if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) ErrorHandling("bind() error"); 25 if (listen(hServSock, 5) == SOCKET_ERROR) ErrorHandling("listen() error"); 26 szClntAddr = sizeof(clntAddr); 27 hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr); 28 if (hClntSock == INVALID_SOCKET) ErrorHandling("accept() error"); 29 send(hClntSock, message, sizeof(message), 0); 30 closesocket(hClntSock); 31 closesocket(hServSock); 32 WSACleanup(); 33 return 0; 34 } 35 36 int Client(char ip[], int port) { 37 WSADATA wsaData; 38 SOCKET hSocket; 39 SOCKADDR_IN servAddr; 40 char message[30]; 41 int strLen; 42 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ErrorHandling("WSAStartup() error"); 43 hSocket = socket(PF_INET, SOCK_STREAM, 0); 44 if (hSocket == INVALID_SOCKET) ErrorHandling("socket() error"); 45 memset(&servAddr, 0, sizeof(servAddr)); 46 servAddr.sin_family = AF_INET; 47 servAddr.sin_addr.S_un.S_addr = inet_addr(ip); 48 servAddr.sin_port = htons(port); 49 if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) ErrorHandling("connect() error"); 50 strLen = recv(hSocket, message, sizeof(message) - 1, 0); 51 if (strLen == -1) ErrorHandling("read() error"); 52 std::cout << "Message from server: " << message << std::endl; 53 closesocket(hSocket); 54 WSACleanup(); 55 return 0; 56 } 57 58 };