广东融都建设有限公司 公司网站,能看各种网站的浏览器,私人订制网站推荐,班级优化大师是干什么用的库说明
Win32 进行网络编程需要使用到 ws2_32.lib 库#xff0c;它是 Windows Sockets 2 (Winsock2) 的库文件#xff0c;其主要头文件为winsock2.h。如果使用 Windows.h 头文件则默认包含 winsock.h#xff0c;他会和 winsock2.h 冲突。可以通过在包含 Windows.h 之前定义…库说明
Win32 进行网络编程需要使用到 ws2_32.lib 库它是 Windows Sockets 2 (Winsock2) 的库文件其主要头文件为winsock2.h。如果使用 Windows.h 头文件则默认包含 winsock.h他会和 winsock2.h 冲突。可以通过在包含 Windows.h 之前定义宏 WIN32_LEAN_AND_MEAN 来排除一些不常用的 Windows 头文件这里面就会排除掉 winsock.h。
// 链接 Winsock 库
#pragma comment(lib, WS2_32.lib) //排除掉 Windows.h 中包含的一些不常用头文件
#define WIN32_LEAN_AND_MEAN
#include Windows.h
#include winsock2.h
#include ws2tcpip.h常用API
API说明参数WSAStartup初始化WinSock库wVersionRequired版本号MAKEWORD(2, 2)表示2.2版本lpWSAData存储关于 Winsock 的信息WSACleanup清理WinSock库socket创建一个socketdomain指定socket使用的地址族AF_INET、AF_INET6等typesocket类型SOCK_STREAMTCP、SOCK_DGRAMUDP等protocol使用的协议IPPROTO_TCP、IPPROTO_UDP0表示自动选择返回值socket的文件描述符号bind将socket与一个特定的地址和端口绑定sockfdsocket文件描述符addr包含地址信息的结构体的指针addrlenaddr结构体长度返回值成功时返回 0失败时返回 SOCKET_ERRORlisten将socket转换为监听状态sockfdsocket文件描述符backlog等待接受连接的客户端的最大数量超过将被拒绝accept接受客户端的连接请求并创建一个新的套接字用于与客户端进行通信sockfdsocket文件描述符addr输出参数用于纪录客户端的地址addrlen输出参数表示addr的实际长度返回值返回一个新的套接字文件描述符如果出现错误返回 SOCKET_ERRORconnect请求连接服务器s标识要连接的 socketname服务器的地址信息namelen服务器地址信息结构体大小send发送内容到socketssocket文件描述符buf发送数据的缓冲区len需要发送字节数flags控制接收操作的行为通常为 0返回值返回发送的字节数。如果出现错误返回 SOCKET_ERRORrecv从已连接的socket接收数据sockfdsocket文件描述符buf接收数据的缓冲区len缓冲区大小可以接收最大字节数flags控制接收操作的行为通常为 0返回值返回接收的字节数。如果连接已关闭返回 0。如果出现错误返回 SOCKET_ERRORclosesocket关闭socketinet_pton将点分十进制的IP转换为Long它不是标准 Winsock 函数它是在高版本中定义的需要引用 Ws2tcpip.h 头文件af地址族AF_INET、AF_INET6 src点分十进制字符串指针转换后的二进制地址inet_ntop将Long类型的IP转换为点分十进制htons将16位主机字节序转换为网络字节序网络字节序都采用大端字节序用于端口号转换htonl将32位主机字节序转换为网络字节序网络字节序都采用大端字节序用于IP转换
服务端
static DWORD WINAPI serverRecv(LPVOID lpParameter) {int* clientSocket (int*)lpParameter;char readBuffer[512];while (true) {memset(readBuffer, 0, 512);int readSize recv(*clientSocket, readBuffer, 512, 0);if (readSize 0) {perror(recv);closesocket(*clientSocket);return 0;}printf(read buffer %s, readBuffer);}return 0;
}static DWORD WINAPI server(LPVOID lpParameter) {// 初始化 Winsock 2.2 版本WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), wsaData) ! 0) {printf(Failed to initialize Winsock\n);}int serverSocket socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (serverSocket INVALID_SOCKET) {perror(socket);}sockaddr_in serverAddr;serverAddr.sin_family AF_INET;serverAddr.sin_addr.S_un.S_addr INADDR_ANY;serverAddr.sin_port htons(12345);if (bind(serverSocket, (struct sockaddr*)serverAddr, sizeof(serverAddr)) -1) {perror(bind);}if (listen(serverSocket, SOMAXCONN) -1) {perror(listen);}while (TRUE) {sockaddr_in clientAddr;int* addrlen NULL;int clientSocket accept(serverSocket, (struct sockaddr*)serverAddr, addrlen);if (clientSocket -1) {perror(accept);continue;}CreateThread(NULL, 0, serverRecv, clientSocket, 0, NULL);}return 0;
}客户端
static DWORD WINAPI client(LPVOID lpParameter) {WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), wsaData) ! 0) {printf(Failed to initialize Winsock\n);}printf(create client socket \n);int clientSocket socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (clientSocket INVALID_SOCKET) {perror(socket);}sockaddr_in serverAddr;serverAddr.sin_family AF_INET;serverAddr.sin_port htons(12345);inet_pton(AF_INET, 127.0.0.1, serverAddr.sin_addr);if (connect(clientSocket, (struct sockaddr*)serverAddr, sizeof(serverAddr)) SOCKET_ERROR) {fprintf(stderr, Failed to connect to server\n);}const char* message Hello, Server!;if (send(clientSocket, message, strlen(message), 0) SOCKET_ERROR) {fprintf(stderr, Failed to send data to server\n);}else {printf(Data sent to server: %s\n, message);}return 0;
}