相关疑难解决方法(0)

socket listen backlog参数,如何判断这个值?

我该如何确定侦听套接字的backlog参数?简单地指定一个非常大的数字是一个问题吗?

c++ sockets tcp

35
推荐指数
2
解决办法
3万
查看次数

listen()忽略了积压参数?

我有以下问题:

我有 sockfd = socket(AF_INET, SOCK_STREAM, 0)

在我设置并绑定套接字后(让我们说sockfd.sin_port = htons(666)),我立即执行:

listen(sockfd, 3);

sleep(50); // for test purposes
Run Code Online (Sandbox Code Playgroud)

我正在睡觉50秒来测试积压参数,这似乎被忽略了,因为我可以在端口666上建立连接*超过3次.

*:我的意思是我从客户端发送的每个第N个SYN(n> 3)获得一个syn/ack并放置在侦听队列中,而不是被丢弃.可能有什么不对?我已经阅读了listen(2)和tcp(7)的手册页,发现:

使用Linux 2.2更改了TCP套接字上的backlog参数的行为.现在它指定了等待接受的完全建立的套接字的队列长度,而不是未完成的连接请求的数量.可以使用/ proc/sys/net/ipv4/tcp_max_syn_backlog设置不完整套接字的队列的最大长度.启用syncookies时,没有逻辑最大长度,并忽略此设置.有关更多信息,请参阅tcp(7).

,但即使有sysctl -w sys.net.ipv4.tcp_max_syn_backlog=2sysctl -w net.ipv4.tcp_syncookies=0,我仍然得到相同的结果!我必须遗漏一些东西或完全误解了listen()积压的目的.

c sockets linux listen

26
推荐指数
2
解决办法
8409
查看次数

当我们说"听一个港口"时会发生什么?

当我们启动服务器应用程序时,我们总是需要指出它侦听的端口号.但这种"倾听机制"是如何在幕后实施的呢?

我目前的想象是这样的:

操作系统将端口号与某个缓冲区相关联.服务器应用程序的职责是监视此缓冲区.如果此缓冲区中没有数据,则服务器应用程序的侦听操作将仅阻止该应用程序.

当某些数据从线路到达时,操作系统将知道该数据,然后检查数据并查看它是否针对此端口号.然后它将填充相应的缓冲区.然后OS将通知被阻止的服务器应用程序,服务器应用程序将获取数据并继续运行.

问题是:

  • 如果上述情况是正确的,那么操作系统怎么知道有来自电线的数据呢?它不能是繁忙的民意调查.它是某种基于中断的机制吗?

  • 如果有太多数据到达且缓冲区不够大,是否会有数据丢失?

  • "监听端口"操作真的是阻塞操作吗?

非常感谢.

networking webserver network-programming

24
推荐指数
3
解决办法
7987
查看次数

listen()在c中的socket编程中的队列长度?

我在Linux中编写了两对代码(server.cclient.c).一个用于UNIX域,AF_UNIX其他用于INTERNET域AF_INET.两者都工作正常!

listen()调用积压队列长度= 3 inboth servers

listen(sockfd, 3);  
Run Code Online (Sandbox Code Playgroud)

在UNIX域(AF_UNIX)中: 当一个客户端与服务器连接时,如果我尝试将更多客户端连接到服务器.三个被排队,第四个的请求被拒绝了.(正如我所希望的 - 等待队列中的3个).

在INTERNET域(AF_INET)中: 超过三个的请求保留在待处理队列中.

即使积压队列长度为3,为什么拒绝来自第四个客户端的请求?为什么listen()(和其他)协议的行为依赖?

c sockets linux network-protocols listen

9
推荐指数
1
解决办法
8918
查看次数