1.注意事项
windows下winsock.h/winsock2.h
linux下sys/socket.h
不同平台头文件不一样
#include <winsock.h> 或者 #include <winsock2.h>
2. 安装minGW
目标是在 Windows 环境下提供类似于 Unix/Linux 环境下的开发工具,使开发者能够轻松地在 Windows 上编写和编译 C、C++ 等程序。
安装参考链接
3. 代码
说明:只有一个电脑,创建进程测试的。代码保存成server.cpp,最后运行
g++ serve.cpp -lws2_32
serve.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
#define PORT 8888
#define MAX_CONNECTIONS 5
//windows下winsock.h/winsock2.h
//linux下sys/socket.h
//不同平台头文件不一样
//#include <winsock.h> 或者 #include <winsock2.h>
//<arpa/inet.h>用<windows.h>代替
DWORD WINAPI serverThread(LPVOID lpParam) {
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = INADDR_ANY;
bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
listen(serverSocket, MAX_CONNECTIONS);
printf("Server listening on port %d\n", PORT);
struct sockaddr_in clientAddr;
int clientAddrLen = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen);
while (1) {
char buffer[1024] = {0};
recv(clientSocket, buffer, 1024, 0);
printf("Received message from client: %s\n", buffer);
send(clientSocket, "Message received.\n", strlen("Message received"), 0);
if (strcmp(buffer, "serve_exit\n") == 0) {
break;
}
}
closesocket(clientSocket);
closesocket(serverSocket);
return 0;
}
int main() {
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
HANDLE serverThreadHandle = CreateThread(NULL, 0, serverThread, NULL, 0, NULL);
Sleep(100); // 等待服务器线程启动
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
char message[1024];
while (1) {
printf("Enter message: ");
fgets(message, 1024, stdin);
send(clientSocket, message, strlen(message), 0);
if (strcmp(message, "exit\n") == 0) {
break;
}
char buffer[1024] = {0};
recv(clientSocket, buffer, 1024, 0);
printf("Server says: %s", buffer);
}
closesocket(clientSocket);
CloseHandle(serverThreadHandle);
WSACleanup();
return 0;
}