连接到服务器时WSAECONNREFUSED

时间:2010-05-01 19:45:45

标签: c++ winsock

我目前正在研究服务器。我知道客户端正在工作(例如,我可以通过端口80连接到www.google.com),但服务器无法正常运行。套接字已成功执行socket()ed,bind()ed和listen(),并且处于接受循环中。唯一的问题是accept()似乎不起作用。 netstat显示服务器连接正常运行,因为它在正确的端口上将服务器进程的PID打印为LISTENING。但是,接受永远不会回来。接受只是继续运行,并运行,如果我尝试连接到localhost上的端口,我得到一个10061 WSACONNREFUSED。我尝试循环连接,它只是一直拒绝连接,直到我按下ctrl + c。我在调用accept()之后直接设置断点,无论我尝试连接到该端口多少次,断点都不会触发。

为什么接受不接受连接?有其他人以前遇到过这个问题吗?

已知:

[breakpoint0]
if ((new_fd = accept(sockint, NULL, NULL)) == -1) {
   throw netlib::error("Accept Error"); //netlib::error : public std::exception
}
else {
   [breakpoint1]
   code...;
}

达到breakpoint0(然后继续),不抛出任何异常,并且永远不会到达breakpoint1。客户端代码被证明有效。 Netstat显示套接字正在侦听。

如果有任何意义,我将在端口5842(随机数)上连接到127.0.0.1。服务器配置为在5842上运行,netstat确认端口正确。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用select并查看是否触发了。因为似乎接受永远不会收到任何联系:

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..
}