首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Accept事件是否在三次握手之后发生?

Accept事件是否在三次握手之后发生?
EN

Stack Overflow用户
提问于 2013-08-27 03:20:43
回答 3查看 2.7K关注 0票数 3

我正在用套接字编程在Linux (客户端和服务器)上编写一个应用程序。我遇到了这样的场景,我的服务器应用程序从不响应另一端的初始SYN数据包。

我还在调试这个问题。

因为我的服务器正在侦听端口,所以它从不生成accept事件。是在TCP握手完成后生成accept事件,还是在收到初始SYN数据包时生成accept事件?

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

最好的

EN

回答 3

Stack Overflow用户

发布于 2013-08-27 06:34:12

是在TCP握手完成后生成的接受事件。

是。

还是在收到初始SYN数据包时生成accept事件?

不是的。握手已经发生了。accept()只是从已经接受的连接队列中为您提供了一个套接字。当队列为空时,它会阻塞。

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

票数 6
EN

Stack Overflow用户

发布于 2013-08-27 04:12:22

Accept()实际上不是一个事件,而是一个封装TCP握手的服务器端逻辑的函数。该函数是预先调用的(等待客户端连接),在握手结束后(它从客户端接收到ACK )返回。

这里有一些详细的解释:http://lwn.net/Articles/508865/ http://www.ibm.com/developerworks/aix/library/au-tcpsystemcalls/

你会得到什么样的错误?确保客户端可以访问您的服务器。

票数 2
EN

Stack Overflow用户

发布于 2020-07-09 01:54:22

TCP握手由内核处理;不涉及服务器进程。内核维护两个队列,一个用于未完成的连接(已收到初始SYN ),另一个用于完成的连接(3次握手完成)。

如果队列为空,并且套接字阻塞调用块直到建立连接,则accept调用将检索完整队列中的第一个条目。如果套接字是非阻塞的,则调用将失败,并返回EAGAINEWOULDBLOCK

参考文献:

  1. https://books.google.com/books?id=ptSC4LpwGA0C&lpg=PP1&pg=PA104#v=onepage&q&f=false/0131411551_ch04lev1sec5.html
  2. https://man7.org/linux/man-pages/man2/accept.2.html
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18451462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档