c++多线程实现监听25端口
时间: 2023-08-15 18:16:00 浏览: 143
在 C++ 中实现监听 25 端口的方式有很多,这里介绍一种基于 Winsock2 的实现方式:
```c++
#include <iostream>
#include <winsock2.h>
#include <thread>
#pragma comment(lib, "ws2_32.lib")
void handle_client(SOCKET client_socket) {
// 处理客户端连接的业务逻辑
std::cout << "Client connected." << std::endl;
// 关闭 socket
shutdown(client_socket, SD_BOTH);
closesocket(client_socket);
std::cout << "Client disconnected." << std::endl;
}
int main() {
// 初始化 Winsock2
WSADATA wsa_data;
int result = WSAStartup(MAKEWORD(2, 2), &wsa_data);
if (result != 0) {
std::cerr << "WSAStartup failed: " << result << std::endl;
return 1;
}
// 创建 socket
SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listen_socket == INVALID_SOCKET) {
std::cerr << "Failed to create socket: " << WSAGetLastError() << std::endl;
WSACleanup();
return 1;
}
// 绑定地址和端口
sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(25);
result = bind(listen_socket, reinterpret_cast<sockaddr*>(&address), sizeof(address));
if (result == SOCKET_ERROR) {
std::cerr << "Failed to bind socket: " << WSAGetLastError() << std::endl;
closesocket(listen_socket);
WSACleanup();
return 1;
}
// 监听端口
result = listen(listen_socket, SOMAXCONN);
if (result == SOCKET_ERROR) {
std::cerr << "Failed to listen: " << WSAGetLastError() << std::endl;
closesocket(listen_socket);
WSACleanup();
return 1;
}
std::cout << "Listening on port 25..." << std::endl;
while (true) {
// 接受客户端连接
SOCKET client_socket = accept(listen_socket, nullptr, nullptr);
if (client_socket == INVALID_SOCKET) {
std::cerr << "Failed to accept client: " << WSAGetLastError() << std::endl;
closesocket(listen_socket);
WSACleanup();
return 1;
}
// 创建新线程处理客户端连接
std::thread(handle_client, client_socket).detach();
}
// 关闭 socket
closesocket(listen_socket);
// 清理 Winsock2
WSACleanup();
return 0;
}
```
该代码片段创建了一个监听 25 端口的 socket,然后不断地接受客户端连接,并在新线程中处理客户端连接的业务逻辑。在业务逻辑处理完毕后,关闭 socket,结束该客户端连接。