使用c++ 写一个多线程监听socket
时间: 2024-03-12 09:44:20 浏览: 53
好的,下面是使用 C++ 多线程监听 socket 的示例代码:
```c++
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <thread>
#include <chrono>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
void handle_connection(int client_socket) {
// 处理与客户端的通信
char buffer[1024];
int n;
while ((n = read(client_socket, buffer, sizeof(buffer))) > 0) {
write(client_socket, buffer, n);
memset(buffer, 0, sizeof(buffer));
}
close(client_socket);
}
int main() {
// 创建监听 socket
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
std::cerr << "Error: Failed to create socket.\n";
return EXIT_FAILURE;
}
// 绑定监听地址和端口
sockaddr_in server_addr;
std::memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(8080);
if (bind(server_socket, (sockaddr*) &server_addr, sizeof(server_addr)) == -1) {
std::cerr << "Error: Failed to bind address.\n";
close(server_socket);
return EXIT_FAILURE;
}
// 开始监听连接请求
if (listen(server_socket, SOMAXCONN) == -1) {
std::cerr << "Error: Failed to listen for connections.\n";
close(server_socket);
return EXIT_FAILURE;
}
std::cout << "Listening for connections on port 8080...\n";
// 接受连接请求并处理
while (true) {
sockaddr_in client_addr;
socklen_t client_addr_size = sizeof(client_addr);
int client_socket = accept(server_socket, (sockaddr*) &client_addr, &client_addr_size);
if (client_socket == -1) {
std::cerr << "Error: Failed to accept connection.\n";
continue;
}
// 创建新线程处理与客户端的通信
std::thread connection_thread(handle_connection, client_socket);
connection_thread.detach();
}
close(server_socket);
return EXIT_SUCCESS;
}
```
在这个示例代码中,我们首先创建了一个监听 socket,然后将其绑定到本地地址和端口上,并开始监听连接请求。每当有一个新的连接请求到达时,我们都会创建一个新的线程来处理与客户端的通信,而主线程则继续监听连接请求。对于每个连接,我们都使用一个单独的线程来处理,这样就可以同时处理多个连接,并提升应用程序的并发性能。在通信结束后,我们关闭与客户端的连接,并让线程自行结束。
请注意,这只是一个简单的示例代码,实际应用程序需要更加健壮和稳定,需要处理更多的错误情况,并采用更好的线程池或协程等技术来提升性能。
阅读全文