用C++编写多线程socket
时间: 2023-08-04 19:39:19 浏览: 58
下面是用C++编写多线程Socket程序的基本步骤:
1. 创建一个Socket对象,并设置Socket属性。
```c++
#include <iostream>
#include <thread>
#include <WinSock2.h>
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
const int PORT = 8888;
const int BUFFER_SIZE = 1024;
int main() {
// 初始化WinSock库
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
// 创建Socket对象
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 设置Socket属性
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
// 绑定Socket对象
bind(serverSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));
// 开始监听Socket对象
listen(serverSocket, SOMAXCONN);
return 0;
}
```
2. 创建一个线程,并在线程中执行Socket通信。
```c++
void handleClient(SOCKET clientSocket) {
// 接收客户端请求
char buffer[BUFFER_SIZE] = {0};
recv(clientSocket, buffer, BUFFER_SIZE, 0);
// 处理请求
// ...
// 发送响应
char response[BUFFER_SIZE] = {0};
send(clientSocket, response, strlen(response), 0);
// 关闭Socket连接
closesocket(clientSocket);
}
int main() {
// ...
while (true) {
// 接收客户端连接请求
SOCKADDR_IN clientAddr;
int len = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &len);
// 创建一个线程处理客户端请求
thread t(handleClient, clientSocket);
t.detach();
}
// ...
return 0;
}
```
在上述代码中,我们使用了C++11中的std::thread类来创建线程,并将线程函数handleClient作为参数传入。在handleClient函数中,我们可以进行Socket通信,并在通信结束后关闭Socket连接。同时,由于我们使用了detach()函数,所以线程的执行与主线程是并行的。
需要注意的是,在多线程编程中,需要考虑线程的同步和互斥,避免多个线程同时访问共享数据导致的竞争和错误。这可以通过使用C++11中的互斥锁和条件变量等机制来实现。