主线程作为server,子线程起client,用c++怎么写
时间: 2023-12-14 14:39:25 浏览: 20
可以使用C++中的socket编程来实现这个功能。以下是一个简单的示例代码:
```c++
#include <iostream>
#include <thread>
#include <winsock2.h> // Windows平台下的socket头文件
#pragma comment(lib, "ws2_32.lib") // 链接ws2_32库
using namespace std;
void clientThread()
{
// 创建socket
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket == INVALID_SOCKET) {
cerr << "Error creating socket: " << WSAGetLastError() << endl;
return;
}
// 设置server地址
sockaddr_in serverAddr = {};
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // server的IP地址
serverAddr.sin_port = htons(12345); // server的端口号
// 连接server
if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
cerr << "Error connecting to server: " << WSAGetLastError() << endl;
closesocket(clientSocket);
return;
}
// 发送数据
char message[] = "Hello from client!";
if (send(clientSocket, message, strlen(message), 0) == SOCKET_ERROR) {
cerr << "Error sending data: " << WSAGetLastError() << endl;
closesocket(clientSocket);
return;
}
cout << "Data sent from client." << endl;
// 关闭socket
closesocket(clientSocket);
}
int main()
{
// 初始化Winsock库
WSADATA wsaData = {};
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
cerr << "Error initializing Winsock." << endl;
return 1;
}
// 创建socket
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (serverSocket == INVALID_SOCKET) {
cerr << "Error creating socket: " << WSAGetLastError() << endl;
WSACleanup();
return 1;
}
// 设置server地址
sockaddr_in serverAddr = {};
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(12345); // 指定端口号
// 绑定socket和地址
if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
cerr << "Error binding socket: " << WSAGetLastError() << endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 监听socket
if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
cerr << "Error listening on socket: " << WSAGetLastError() << endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
cout << "Server started." << endl;
// 接受client连接
sockaddr_in clientAddr = {};
int addrLen = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &addrLen);
if (clientSocket == INVALID_SOCKET) {
cerr << "Error accepting client connection: " << WSAGetLastError() << endl;
closesocket(serverSocket);
WSACleanup();
return 1;
}
cout << "Client connected." << endl;
// 接收数据
char buffer[1024];
int recvLen = recv(clientSocket, buffer, sizeof(buffer), 0);
if (recvLen == SOCKET_ERROR) {
cerr << "Error receiving data: " << WSAGetLastError() << endl;
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 1;
}
buffer[recvLen] = '\0';
cout << "Data received from client: " << buffer << endl;
// 关闭socket
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
// 创建client线程
thread client(clientThread);
client.join();
return 0;
}
```
代码中创建了一个主线程作为server,负责监听端口并接受client连接。当client连接成功后,主线程从client接收数据,并关闭连接。同时,主线程还创建了一个子线程,作为client向server发送数据。