c/c++ socket 的一些疑问

发布于 2022-09-06 11:36:50 字数 716 浏览 27 评论 0

连接队列和一个服务器一共能建立多少条连接的疑问
1.socket listen() 开始后系统内核建立的syn/accept队列,会影响一台服务器一共(不是同时)建立多少条客户端连接吗?
2.当新的连接完成三次握手,从syn队列移动到accept队列中时,应用进程就会触发accept函数?
3.那这个accept队列中这条新的连接,是不是就算从队列中弹出来了?这样accept队列的空间又复原了?

2. socket send(), recv()函数的流程是什么样的?
1.当服务器跟客服端建立连接时,accept()函数会返回一个socket描述符,对应着socket的数据结构,是不是也相应的给每个新连接分配一块内存空间,所有的读写操作都找到对应的socket内存空间,进行读和写吗?还是有两块内存,一个放底层收到的客服端发来的内容,一个放服务器发送的内容
2.服务器接收客服端的数据,是socket底层帮我们都放到每个对应的socket内存中吗?我们遍历每个socket根据每个socket的状态,查看是否有数据可读?
3.服务器同时能接收多少个数据包,取决于什么?收到这些数据都放在哪里?放到同一个地方,还是分开放的,对应着不同的socket描述符?如果放数据包的位置放不下了,客服端的数据还能发过来吗?

求大牛解答

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千年*琉璃梦 2022-09-13 11:36:50

问题一,是的,listen参数backlog就是这个没有建立(accept)的连接队列的最大长度,不过系统内核还有另外一个上限控制,backlog不是随便设多大就行。
问题二,这个socket对象在内核内存里,你只有它的句柄(fd)。
内核其中包括收发的缓冲区。你不能直接读写它,内核收发时read或send时,会把内核缓冲区的数据拷贝到用户空间或者反之。能接收多少数据取决于内核和网卡驱动的参数配置,即相应内核缓冲区的大小。不同的IP连接有不同的描述符,不同进程之间也是隔离的,都在内核里统一维护。如果放不下。UDP会导致丢包,TCP连接对方则会尝试重发。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文