连接到服务器时 WSAECONNREFUSED
Posted
技术标签:
【中文标题】连接到服务器时 WSAECONNREFUSED【英文标题】:WSACONNREFUSED when connecting to server 【发布时间】:2010-05-01 19:45:44 【问题描述】:我目前正在使用服务器。我知道客户端正在工作(例如,我可以在端口 80 上连接到 www.google.com),但服务器运行不正常。套接字已成功完成 socket()ed、bind() 和 listen()ed 并且处于接受循环中。唯一的问题是 accept() 似乎不起作用。 netstat 显示服务器连接运行良好,因为它在正确的端口上将服务器进程的 PID 打印为 LISTENING。但是,接受永远不会返回。接受只是继续运行,并且运行,如果我尝试连接到本地主机上的端口,我会得到一个 10061 WSCONNREFUSED。我尝试循环连接,它只是一直拒绝连接,直到我点击 ctrl+c。我在调用 accept() 后直接设置了一个断点,无论我尝试连接到该端口多少次,断点都不会触发。
为什么accept不接受连接?以前有没有其他人遇到过这个问题?
已知:
[breakpoint0]
if ((new_fd = accept(sockint, NULL, NULL)) == -1)
throw netlib::error("Accept Error"); //netlib::error : public std::exception
else
[breakpoint1]
code...;
达到断点0(然后继续),不抛出异常,并且永远不会达到断点1。客户端代码被证明可以工作。 Netstat 显示套接字正在侦听。
如果这意味着什么,我将连接到端口 5842 上的 127.0.0.1(随机数)。服务器配置为在 5842 上运行,netstat 确认端口正确。
【问题讨论】:
您是否在防火墙上对此端口号进行了例外处理? 即使我禁用了防火墙,该程序也无法运行。 在服务器机器上运行类似 Wireshark 的东西,你能看到来自客户端的 SYN 数据包,试图建立连接吗?你能看到,在客户端机器上,SYN 数据包出去了吗? 我正在运行本地主机本地主机。然而,运行wireshark,当我使用客户端连接到外部主机时,我可以看到SYN/ACK数据包进来。如果我找到带有 IP 的网络并连接到该地址,我找不到任何 SYN 或 ACK 数据包从我的 IP 或所需端口上的路由器 ip 进入计算机。我也看不到任何 ICMP 数据包,这将是发送连接拒绝数据包的常用方法。如果需要,我可以发布完整的源代码,但它相当大,并且不认为设置套接字有问题。 我想需要更多的代码。也许是愚蠢的评论,我猜您使用相同的系列、类型和协议用于服务器套接字和客户端套接字(AF_INET | SOCK_STREAM | IPPROTO_TCP)? 【参考方案1】:您可以尝试使用 select 并查看是否触发。因为好像 accept 从来没有收到任何连接:
fd_set mySet;
FD_ZERO(&mySet);
FD_SET(sockint, &mySet);
timeval zero = 0, 0 ;
int sel = select(0, &mySet, NULL, NULL, &zero);
if (FD_ISSET(sockint, &mySet))
// you have a new caller
SOCKET newSocket = accept(sockint, NULL, NULL);
else
// still waiting
<print>("Still waiting for connection.."); // whatever printfunction you use..
【讨论】:
以上是关于连接到服务器时 WSAECONNREFUSED的主要内容,如果未能解决你的问题,请参考以下文章