c/c++ socket 的一些疑问

seq_ack
  • 125

连接队列和一个服务器一共能建立多少条连接的疑问
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描述符?如果放数据包的位置放不下了,客服端的数据还能发过来吗?

求大牛解答

回复
阅读 2.6k
1 个回答

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

宣传栏