C++ 多线程TCP收发数据
时间: 2024-01-09 11:23:21 浏览: 28
C++中实现多线程TCP收发数据的方法如下:
1. 创建套接字和绑定端口:
```cpp
#include <iostream>
#include <thread>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
void clientHandler(SOCKET clientSocket) {
// 处理客户端请求的线程函数
char buffer[1024];
while (true) {
memset(buffer, 0, sizeof(buffer));
int bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);
if (bytesRead <= 0) {
break;
}
std::cout << "Received: " << buffer << std::endl;
// 处理接收到的数据
// 发送响应数据
send(clientSocket, buffer, bytesRead, 0);
}
// 关闭客户端套接字
closesocket(clientSocket);
}
int main() {
// 初始化Winsock
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "Failed to initialize winsock" << std::endl;
return 1;
}
// 创建服务器套接字
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET) {
std::cerr << "Failed to create socket" << std::endl;
WSACleanup();
return 1;
}
// 绑定端口
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(12345); // 设置监听端口
serverAddr.sin_addr.s_addr = INADDR_ANY;
if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
std::cerr << "Failed to bind socket" << std::endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 监听客户端连接
if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
std::cerr << "Failed to listen on socket" << std::endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
std::cout << "Server started, waiting for connections..." << std::endl;
while (true) {
// 接受客户端连接
sockaddr_in clientAddr;
int clientAddrSize = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &clientAddrSize);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Failed to accept client connection" << std::endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 创建新线程处理客户端请求
std::thread clientThread(clientHandler, clientSocket);
clientThread.detach();
}
// 关闭服务器套接字
closesocket(serverSocket);
WSACleanup();
return 0;
}
```
2. 创建客户端套接字并连接服务器:
```cpp
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main() {
// 初始化Winsock
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "Failed to initialize winsock" << std::endl;
return 1;
}
// 创建客户端套接字
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Failed to create socket" << std::endl;
WSACleanup();
return 1;
}
// 连接服务器
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(12345); // 设置服务器端口
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置服务器IP地址
if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
std::cerr << "Failed to connect to server" << std::endl;
closesocket(clientSocket);
WSACleanup();
return 1;
}
// 发送数据
const char* message = "Hello, server!";
send(clientSocket, message, strlen(message), 0);
// 接收响应数据
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);
if (bytesRead > 0) {
std::cout << "Received: " << buffer << std::endl;
}
// 关闭客户端套接字
closesocket(clientSocket);
WSACleanup();
return 0;
}
```