我正在使用套接字编程在Linux(客户端和服务器)上编写应用程序。我遇到了这个场景,我的服务器应用程序从不响应另一端的初始SYN数据包。
我仍在调试此问题。
由于我的服务器正在侦听端口,因此它永远不会生成接受事件。是否在TCP握手完成后生成了accept事件,还是在收到初始SYN数据包时生成了accept事件?
一些有用的链接会有所帮助。
最佳
答案 0 :(得分:4)
在TCP握手完成后是否生成了accept事件
是
或者,当收到初始SYN数据包时会生成接受事件吗?
没有。握手已经发生了。 accept()
只是从已接受的连接队列中为您提供套接字。队列为空时,它会阻塞。
这意味着即使服务器从未调用accept()
,客户端也可以连接。
答案 1 :(得分:2)
Accept()不是一个事件,而是一个封装TCP握手的服务器端逻辑的函数。该函数事先被调用(等待客户端连接),并在握手结束后返回(它从客户端收到ACK)。
这里有一些详细的解释: http://lwn.net/Articles/508865/ http://www.ibm.com/developerworks/aix/library/au-tcpsystemcalls/
你得到什么样的错误?确保客户端可以访问您的服务器。
答案 2 :(得分:0)
TCP握手由内核处理;不涉及服务器进程。内核维护两个队列,一个用于不完整的连接(接收到初始SYN),另一个用于完整的连接(三向握手完成)。
accept
调用检索完整队列中的第一个条目,如果该队列为空并且套接字阻塞了调用块,直到建立连接。如果套接字是非阻塞的,则调用失败,并显示EAGAIN
或EWOULDBLOCK
。
参考: