C++实现同时连接192.168.10.131服务器双端口的需求语义疑问
题目语义澄清与实现方案
语义判定
原题目明确要求通过两个不同socket同时连接IP为192.168.10.131的服务器的2345、4325两个端口,核心动作是「连接」,目标对象是指定IP服务器的两个端口,因此你的第一种理解是正确的:你需要编写客户端程序,创建两个独立socket,分别主动连接远端服务器192.168.10.131的两个监听端口。
你误解的第二种场景完全不符合题目描述,题目中192.168.10.131是被连接的服务端,而非主动发起连接的客户端。如果确实需要实现第二种场景,只需要把下述客户端代码部署在192.168.10.131机器上,将connect的目标IP修改为对端服务器IP即可,逻辑完全一致。
实现思路
- 创建两个
socket实例,分别调用connect接口,目标端口对应配置为htons(2345)和htons(4325),目标IP固定为192.168.10.131 - 两个连接可以放到独立线程中运行,避免I/O阻塞互相影响;如果性能要求更高也可以用
select/epoll等IO多路复用方案在单线程内管理两个连接的读写,两种实现都符合要求
简化实现代码示例
#include <iostream> #include <thread> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <cstring> void connect_remote_port(int target_port) { // 创建TCP socket int sock_fd = socket(AF_INET, SOCK_STREAM, 0); if (sock_fd < 0) { perror("socket创建失败"); return; } // 配置对端服务器地址 sockaddr_in server_addr; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(target_port); if (inet_pton(AF_INET, "192.168.10.131", &server_addr.sin_addr) <= 0) { perror("非法的服务器IP地址"); close(sock_fd); return; } // 发起连接 if (connect(sock_fd, (sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("连接服务器失败"); close(sock_fd); return; } std::cout << "成功连接到服务器:192.168.10.131:" << target_port << ",socket fd为:" << sock_fd << std::endl; // 此处可以添加自定义的读写逻辑 // ... // 关闭socket close(sock_fd); } int main() { // 两个线程分别连接两个端口 std::thread t1(connect_remote_port, 2345); std::thread t2(connect_remote_port, 4325); t1.join(); t2.join(); return 0; }
内容的提问来源于stack exchange,提问作者Pankaj Belwal
相关产品推荐
相关产品推荐

