三次握手后Accept事件发生吗?

问题描述 投票:0回答:3

我正在Linux上使用套接字编程编写一个应用程序(客户端和服务器)。我遇到过这样的情况,我的服务器应用程序永远不会响应另一端的初始 SYN 数据包。

我仍在调试该问题。

由于我的服务器正在侦听端口,因此它永远不会生成接受事件。接受事件是在 TCP 握手完成后生成还是在收到初始 SYN 数据包时生成接受事件?

一些有用的链接,会有帮助的。

最好的

sockets networking tcp client-server
3个回答
8
投票

TCP握手完成后是否产生accept事件

是的。

或者当收到初始 SYN 数据包时生成接受事件?

不。握手已经发生了。

accept()
只是从已接受的连接队列中为您提供一个套接字。当队列为空时,它会阻塞。每当队列(listen()积压队列)中有东西时,就会生成接受
事件
(实际上是侦听套接字上的“可读”事件)。

这意味着即使服务器从未调用过,客户端也可以连接。

    


2
投票

这里有一些详细的解释:

http://lwn.net/Articles/508865/

http://www.ibm.com/developerworks/aix/library/au-tcpsystemcalls/ 您遇到什么样的错误?确保客户端可以访问您的服务器。


0
投票

如果队列为空并且套接字正在阻塞,则

accept()

调用将检索完整队列中的第一个条目,直到建立连接为止。如果套接字是非阻塞的,则调用失败并显示

accept
EAGAIN
参考资料:

    https://books.google.com/books?id=ptSC4LpwGA0C&lpg=PP1&pg=PA104#v=onepage&q&f=false/0131411551_ch04lev1sec5.html
  1. https://man7.org/linux/man-pages/man2/accept.2.html
© www.soinside.com 2019 - 2024. All rights reserved.