windows 2k 里的listen(SOCKET s,int backlog)的第二个参数不起作用吗?

moqingsong 2002-11-12 10:17:51
listen的原型
int listen(
SOCKET s,
int backlog
);
对backlog的说明:
[in] Maximum length of the queue of pending connections. If set to SOMAXCONN, the underlying service provider responsible for socket s will set the backlog to a maximum reasonable value. There is no standard provision to obtain the actual backlog value.

应该是可以设定接入连接数的。我用下面的代码还是可以接入。
把backlog设成1,接进多少台都没问题。请问我哪里设的有问题吗?谢谢。

if (SOCKET_ERROR == listen (s, 0))
{
printf ("Listen failed: %u\n", GetLastError ());
closesocket(s) ;
return(FALSE);
}
else
{
printf("Listening ! \n");
}
...全文
1944 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
moqingsong 2002-11-12
  • 打赏
  • 举报
回复
那意思是不是backlog设定的只是同时发生的accept数,接就是说,不管已经有多少个connection已经在了,只要在某一时可同时接入的connect 小于backlog,就可以接入?
我做的实验是,backlog设为1时,在另一台机子同时开若干个连接tcp同时保持连接状态(connecting),还是可以继续链入。
实际上我是想用它来设定本server的connection数。
是不是应该用别的来做?
along008 2002-11-12
  • 打赏
  • 举报
回复
backlog是连接请求队列的最大长度。
1.在WinSock1.1中最大值5。如果backlog小于1,则backlog被置喂1;若backlog大于SOMAXCONN(定义在winsock.h中,值为5),则backlog被置为SOMAXCONN。
2.在WinSock2中,没有制定具体值,它由服务提供者决定
3.有时候backlog设置很小,这时我们接进多少台机器都没问题是因为服务器机器处理速度很快队列来不及填满就处理完了,而且在同一个时刻到来的连接还是很少的
azlza 2002-11-12
  • 打赏
  • 举报
回复
因为你的连接不是同时的阿
moqingsong 2002-11-12
  • 打赏
  • 举报
回复
我的程序实际运行的时候它没发生作用。那位给指导一下可能是哪里设错了?
yanhuahui 2002-11-12
  • 打赏
  • 举报
回复
《TCP/IP详解 卷1:协议》的Page195有详细解释。
1)backlog 用于在TCP层接收链接的缓冲池的最大个数,这个个数可在应用层中的listen函数里设置,当客户链接请求大于这个个数(缓冲池满),其它的未进入链接缓冲池的客户端在tcp层上tcp模块会自动重新链接,直到超时(大约57秒后)
2)我们的应用层的链接完成是要从tcp层的链接缓冲池中移出一个(accept函数实现)
tleon 2002-11-12
  • 打赏
  • 举报
回复


比如同时有10个连接请求,如果你的listen(s,5)的话,其他5个请求就会返回忙的信息,客户端就得重试。

也就是说,值的大小就是对连接缓冲的大小
moqingsong 2002-11-12
  • 打赏
  • 举报
回复
给分了,谢谢大家。
moqingsong 2002-11-12
  • 打赏
  • 举报
回复
谢谢前边几位给的建议,我现在已经是按along008(风筝)的方法作的了,你说的计数值,应该是全局变量吧?是不是对它读写的时候,还有必要同步一下?
along008 2002-11-12
  • 打赏
  • 举报
回复
是这个意思,
如果想限制本server的连接数,我通常的做法是在Server收到连接请求的时候,做个计数值成功连接则增加一,当连接断开的时候就减一。在这之前自己可以设置一个宏指定连接数的最大值,每次收到连接时判断计数值是否超过设置的宏值(最大连接数)。超过了则发给客户端消息告诉他已经超过Server的最大连接数,然后closesocket()关闭刚建立的连接就可以了。
宏就是server限制的connection数。
yanhuahui 2002-11-12
  • 打赏
  • 举报
回复
用别的做,要么没accpet一次则将某个成员变量加一。你对backlog 的意思还是没了解透,我建议你找《TCP/IP详解 卷1:协议》看看

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧