使用Poco Net连接非80端口TCP套接字时遇ConnectionRefusedException问题咨询
问题根源
你的代码崩溃并非Poco Net语法错误,而是目标端口4001没有对应的TCP服务在监听,连接被拒绝时抛出了未捕获的异常。换成80端口能成功,是因为你的系统上80端口有服务(如Web服务器)在运行。
正确的Poco TCP客户端实现(含异常处理与完整收发)
以下是包含异常捕获、数据发送与接收的完整TCP客户端代码:
#include <Poco/Net/StreamSocket.h> #include <Poco/Net/SocketAddress.h> #include <Poco/Exception.h> #include <iostream> #include <cstring> int main(int argc, char** argv) { try { // 创建Socket并连接目标地址 Poco::Net::StreamSocket sock; Poco::Net::SocketAddress addr("127.0.0.1", 4001); sock.connect(addr); std::cout << "成功连接到服务器" << std::endl; // 发送数据 const char* sendData = "Hello from Poco TCP Client!"; int sentBytes = sock.sendBytes(sendData, std::strlen(sendData)); std::cout << "已发送 " << sentBytes << " 字节数据" << std::endl; // 接收服务器返回数据 char buf[256] = {0}; // 初始化缓冲区避免垃圾数据 int receivedBytes = sock.receiveBytes(buf, sizeof(buf)); std::cout << "收到 " << receivedBytes << " 字节数据: " << buf << std::endl; // 关闭连接 sock.close(); } catch (const Poco::Net::ConnectionRefusedException& e) { std::cerr << "连接失败: " << e.what() << std::endl; return 1; } catch (const Poco::Exception& e) { std::cerr << "网络异常: " << e.what() << std::endl; return 1; } catch (...) { std::cerr << "未知异常发生" << std::endl; return 1; } return 0; }
关键注意事项
- 必须捕获异常:Poco网络操作会抛出异常,用
try-catch处理可避免程序直接崩溃。 - 验证端口监听状态:若要连接4001端口,需先确保有TCP服务器在该端口监听,可通过终端命令
nc -l 4001启动简易测试服务器。 - 初始化缓冲区:接收数据前初始化缓冲区,防止输出垃圾内容。
- 编译链接要求:编译时需链接Poco相关库,示例命令:
g++ -o tcp_client tcp_client.cpp -lPocoNet -lPocoFoundation
内容的提问来源于stack exchange,提问作者Nabila Salmi
相关产品推荐
相关产品推荐

