用socket实现windows进程间通信
时间: 2025-04-02 09:26:57 浏览: 29
### 使用 Socket 实现 Windows 平台上的进程间通信
在 Windows 平台上,可以通过使用 **TCP/IP 协议栈中的套接字(Socket)** 来实现进程间的通信。这种 IPC 方法允许在同一主机上运行的多个进程通过网络协议进行数据交换。尽管通常认为 Socket 是一种跨机器通信的方式,但在本地环境中也可以利用回环地址 `127.0.0.1` 或 UNIX 域套接字(如果支持的话),从而高效地完成进程间通信。
以下是具体方法以及示例代码:
#### 服务器端代码
服务器负责监听来自客户端的连接请求并处理传入的数据流。
```c
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
#define PORT 8080
#define MAX_BUFFER_SIZE 1024
int main() {
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
printf("WSAStartup failed with error: %d\n", iResult);
return 1;
}
struct addrinfo hints, *res;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET; // IPv4
hints.ai_socktype = SOCK_STREAM; // TCP Stream
hints.ai_protocol = IPPROTO_TCP;
iResult = getaddrinfo(NULL, "8080", &hints, &res);
if (iResult != 0) {
printf("getaddrinfo failed with error: %d\n", iResult);
WSACleanup();
return 1;
}
SOCKET ListenSocket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (ListenSocket == INVALID_SOCKET) {
freeaddrinfo(res);
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
iResult = bind(ListenSocket, res->ai_addr, (int)res->ai_addrlen);
if (iResult == SOCKET_ERROR) {
freeaddrinfo(res);
closesocket(ListenSocket);
printf("bind failed with error: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
freeaddrinfo(res);
iResult = listen(ListenSocket, SOMAXCONN); // Start listening for client connections.
if (iResult == SOCKET_ERROR) {
printf("listen failed with error: %ld\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
SOCKET ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
printf("accept failed: %ld\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
char recvbuf[MAX_BUFFER_SIZE];
int bytesReceived = recv(ClientSocket, recvbuf, MAX_BUFFER_SIZE, 0);
if (bytesReceived > 0) {
recvbuf[bytesReceived] = '\0';
printf("Bytes received from client: %s\n", recvbuf);
} else {
printf("recv failed: %ld\n", WSAGetLastError());
}
closesocket(ClientSocket);
closesocket(ListenSocket);
WSACleanup();
return 0;
}
```
#### 客户端代码
客户端发起与服务器的连接,并向其发送消息。
```c
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
#define SERVER_IP "127.0.0.1"
#define PORT 8080
int main() {
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
printf("WSAStartup failed with error: %d\n", iResult);
return 1;
}
struct addrinfo hints, *res;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
iResult = getaddrinfo(SERVER_IP, "8080", &hints, &res);
if (iResult != 0) {
printf("getaddrinfo failed with error: %d\n", iResult);
WSACleanup();
return 1;
}
SOCKET ConnectSocket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (ConnectSocket == INVALID_SOCKET) {
freeaddrinfo(res);
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
iResult = connect(ConnectSocket, res->ai_addr, (int)res->ai_addrlen);
if (iResult == SOCKET_ERROR) {
freeaddrinfo(res);
closesocket(ConnectSocket);
printf("connect failed: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
freeaddrinfo(res);
const char* sendbuf = "Hello Server!";
iResult = send(ConnectSocket, sendbuf, strlen(sendbuf), 0);
if (iResult == SOCKET_ERROR) {
printf("send failed: %ld\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
printf("Message sent to server.\n");
closesocket(ConnectSocket);
WSACleanup();
return 0;
}
```
上述代码展示了如何基于 WinSock API 构建简单的客户端-服务器模型[^1]。需要注意的是,在实际应用中可能还需要考虑错误处理、超时设置以及其他高级功能以增强健壮性。
对于更高效的本地通信方案,可以探索 **Unix Domain Sockets 的替代品——命名管道(Named Pipes)或共享内存(Shared Memory)** 等技术,这些更适合于单机环境下的高性能需求场景[^4]。
阅读全文
相关推荐




















