我目前正在研究服务器。我知道客户端正在工作(例如,我可以通过端口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确认端口正确。
答案 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..
}