欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > 浅谈C++之多线程处理TCP请求

浅谈C++之多线程处理TCP请求

2025/2/24 8:38:56 来源:https://blog.csdn.net/a876106354/article/details/142752393  浏览:    关键词:浅谈C++之多线程处理TCP请求

一、基本介绍

        在C++中,使用多线程处理TCP请求通常涉及到使用套接字(sockets)和线程库。C++11标准引入了<thread>库,使得多线程编程更加简单。以下是一个简单的示例,展示如何使用C++的套接字和<thread>库来创建一个多线程的TCP服务器。

二、简单示例

1. 服务器端

服务器端使用socket来监听端口,每当有客户端连接时,它就创建一个新的线程来处理这个连接。

#include <iostream>
#include <thread>
#include <cstring>
#include <cstdio>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>void handle_client(int client_socket) {char buffer[1024];int read_size;while ((read_size = read(client_socket, buffer, 1024)) > 0) {std::cout << "Received: " << buffer << std::endl;write(client_socket, buffer, read_size); // Echo back to client}close(client_socket);
}int main() {int server_fd, new_socket, valread;struct sockaddr_in address;int opt = 1;int addrlen = sizeof(address);// Creating socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// Forcefully attaching socket to the port 8080if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(8080);// Forcefully attaching socket to the port 8080if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}while (1) {if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}std::thread(client_thread, new_socket).detach();}return 0;
}

2. 客户端

客户端使用socket来连接服务器,并发送消息。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>int main() {struct sockaddr_in serv_addr;int sock = 0;char buffer[1024] = {0};if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {std::cout << "\n Socket creation error \n";return -1;}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(8080);// Convert IPv4 and IPv6 addresses from text to binary formif(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {std::cout << "\nInvalid address/ Address not supported \n";return -1;}if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {std::cout << "\nConnection Failed \n";return -1;}std::cout << "\n Enter the message to send: \n";std::cin.getline(buffer, 1024);send(sock, buffer, strlen(buffer), 0);read(sock, buffer, 1024);std::cout << "\nServer reply : \n";std::cout << buffer << std::endl;close(sock);return 0;
}

说明:

  1. 服务器端

    • 使用socket创建一个监听套接字。
    • 使用bind将套接字绑定到特定的IP地址和端口。
    • 使用listen使套接字进入监听状态。
    • 使用accept接受客户端连接,并为每个连接创建一个新的线程。
    • handle_client函数处理客户端的请求,读取数据并回显。
  2. 客户端

    • 使用socket创建一个套接字。
    • 使用connect连接到服务器。
    • 使用send发送消息到服务器。
    • 使用read接收服务器的响应。

这个示例展示了如何使用C++进行基本的多线程TCP通信。你可以根据需要扩展这个示例,比如添加错误处理、支持更多的并发连接等。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词