一个简单的Windows TCP服务器实现
包含头文件
#include <winsock2.h>
#include <stdio.h>
需要链接的库文件
ws2_32.lib
winsocket初始化
WSADATA wsaData;
SOCKET serverSocket, clientSocket;
struct sockaddr_in serverAddr = { 0x00 };
struct sockaddr_in clientAddr = { 0x00 };
int clientAddrLen = sizeof(clientAddr);
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed.\n");
}
创建winsocket
if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
printf("Socket failed.\n");
WSACleanup();
}
IP及端口号配置
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(9988);
if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("Bind failed.\n")
closesocket(serverSocket);
WSACleanup();
}
监听客户端连接
if (listen(serverSocket, 5) == SOCKET_ERROR) {
printf("Listen failed.\n");
closesocket(serverSocket);
WSACleanup();
}
接受客户端连接
if ((clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen)) == INVALID_SOCKET) {
printf("Accept failed.\n");
closesocket(serverSocket);
WSACleanup();
}
接收数据
int bytesReceived = recv(clientSocket, (char*)(_sRxBuffer + _sRxLenght), BUFFER_SIZE, 0);
发送数据
int txPacketlenght = send(socket, (const char*)_sTxBuffer, txPacketlenght, 0);
回收winsocket资源
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
检查连接断开情形
int bytesReceived = recv(clientSocket, buffer, bufferSize, 0);
if (bytesReceived == 0) {
printf("Client socket disconnected gracefully.\n");
} else if (bytesReceived == SOCKET_ERROR) {
int error = WSAGetLastError();
if (error == WSAECONNRESET) {
printf("Client socket disconnected unexpectedly.\n");
} else {
printf("Recv failed with error: %d\n", error);
}
}