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