当前位置:  技术问答>linux和unix

请问关于listen(int sockfd, int n)函数的问题

    来源: 互联网  发布时间:2015-11-12

    本文导语:  近日学习socket编程,对于listen函数有点不大明白,我看资料上写的是:是在请求连接的队列中允许的连接数目。对于这个队列的说法我有点不明白就是,是不是如果我执行了accept后,队列中的请求连接数就会减少一个...

近日学习socket编程,对于listen函数有点不大明白,我看资料上写的是:是在请求连接的队列中允许的连接数目。对于这个队列的说法我有点不明白就是,是不是如果我执行了accept后,队列中的请求连接数就会减少一个?然后客户端就可以继续增加一个连接请求到队列中,只要服务器端不断的accept,那么客户端就可以不断的增加连接数。
那这个参数对于控制客户端的连接数似乎没多大作用啊。比如我现在想控制客户端的连接数,我是不是只能通过其他方式控制呢?比如说控制我的服务器程序的子进程数或者线程数

|
下面的几句话也许能解释你的问题:
listen的第二个参数在不同系统中的实现是不同的,就像fierygnu(va_list) 说的那样。但是内核维护的这两个序列(一个完成连接队列,一个未完成连接队列),在三次握手后才修改队列(tcp的话)。

The listen function is called only by a TCP server and it performs two actions:

1、When a socket is created by the socket function, it is assumed to be an active socket, that is, a client socket that will issue a connect. The listen function converts an unconnected socket into a passive socket, indicating that the kernel should accept incoming connection requests directed to this socket. In terms of the TCP state transition diagram (Figure 2.4), the call to listen moves the socket from the CLOSED state to the LISTEN state.

2、The second argument to this function specifies the maximum number of connections the kernel should queue for this socket.


To understand the backlog argument, we must realize that for a given listening socket, the kernel maintains two queues:

An incomplete connection queue, which contains an entry for each SYN that has arrived from a client for which the server is awaiting completion of the TCP three-way handshake. These sockets are in the SYN_RCVD state (Figure 2.4).

A completed connection queue, which contains an entry for each client with whom the TCP three-way handshake has completed. These sockets are in the ESTABLISHED state (Figure 2.4).


The backlog argument to the listen function has historically specified the maximum value for the sum of both queues.  (listen的第二个参数通常设定为这两个队列之和)


There has never been a formal definition of what the backlog means. The 4.2BSD man page says that it "defines the maximum length the queue of pending connections may grow to." Many man pages and even the POSIX specification copy this definition verbatim, but this definition does not say whether a pending connection is one in the SYN_RCVD state, one in the ESTABLISHED state that has not yet been accepted, or either. The historical definition in this bullet is the Berkeley implementation, dating back to 4.2BSD, and copied by many others.





|
控制客户端的数量不是这个来控制的,而是控制子进程的数量,我是用个全局变量childnum,
fork返回值大于0的那个分支中childnum+1
signal(SIGCHLD,sig_chld); //处理死掉的子进程,获取SIGCHLD信号
void sig_chld(int signo)//儿子一中断就消息触发到此函数,然后在这里childnum-1;
{
  childnum-1;
}

这样你在fork之前判断一下childnum是否大于你的最多连接数,这样就可以了

    
 
 

您可能感兴趣的文章:

  • 请问:定义了2个函数,其中第一个函数要访问另外一个函数的变量,怎么处理阿?谢谢
  • 请问如何根据函数指针打印出这个函数的名称?
  • 一个父类的构造函数的参数是(Applet applet),请问它的子类构造函数当中应怎样调用父类构造函数?
  • 请问在REDHAT下使用gcc编译器用的是什么函数库,函数库的资料应该上哪儿找?
  • 请问有JSP的函数大全吗?如session的所有函数。
  • 请问有没头函数<pthread.h>和<signal.h>里的函数的详细功能介绍?和使用方法???
  • 请问在JAVA里将小写字母换为大写字母是用什么函数,大写转成小写又是用哪个函数?
  • 请问如何在一个函数内部定义的一个新类中使用函数里声明的变量
  • 请问在rh7.2下面,semop()函数可以用其他什么函数来代替?
  • 请问ltoa这个函数的源代码文件叫什么名字(*.c)
  • 请问在linux/unix下有没有象GetKeyboardState()一样对键盘状态进行控制的函数?
  • 请问:java 的applet如何调用本地的c函数?
  • 请问哪儿有Motif的函数说明,比如像VC下的MSDN?
  • 请问这样写对吗?int 函数名(),变量;
  • 请问如何查看libX11.so中的函数实现
  • 请问linux下ftell函数的对应64位函数?
  • 请问在linux调试中能否有调用函数的显示时间
  • 请问用什么函数可以把String转换成int
  • 请问linux下有什么函数相当于MFC里的AfxIsValidAddress啊?
  • 请问,在linux下有没有类似messagebox这个函数。
  • 请问 int indexOf(String str)和 int lastIndexOf(String str)方法有什么区别?
  • 请问:int main( int argc,char *argv[] )怎么支持三个参数?
  • 请问能否把任何类型数据转换为一种类型,然后从这种类型又转换回去?例如:int>>Object Object>>int
  • 请问System.exit(int);里面的int参数都用什么值呀,如0,1,有何不同?
  • 请问一下,有谁知道linux源代码中socket(int domain, int type, int protocol);函数的定义是在哪个文件中啊?小弟我找了很久,都没找到,谢谢哈。
  • 请问使用_int64需要什么头文件?
  • 请问如何将Byte型转换为int型?
  • 请问:有没有对数组(int)进行排序的的方法???
  • 请问高手们,怎样把int 转换成String 型
  • 请问int型参数如何传递?
  • 请问如何将float型的数据转换为int型的?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问listen函数中最大队列的问题
  • 请问listen函数的执行过程
  • 请问一个socket在listen()之后如果把它close()了,那之前已经用子进程处理的连接还在不在?
  • 高手何在,请问如何箱qq一样在局域网内也可以建立udp的服务端进行listen而且网外的用户也可以访问到!满分送上!!!!
  • 请问:我知道路由器的telnet密码,但忘记了enable 密码,请问如何是好?
  • 请问那里有SYBASE的jbdb 2.0下载;jspsmartupload可以直接将文件上传到数据库,请问如何使用
  • 请问最新的reahat9.0是基于什么核心的?2.4?2.6?请问那里能下载?
  • 请问:请问哪里有关于linux基本操作命令讲解的资料下载,最好是幻灯片格式的.
  • 请问,我试图用#admintool&图形工具命令来安装sun workshop5.0,为什么进入的却是用户管理界面?请问具体该如何在solaris下安装应用软件
  • 请问在Redhat 9里,我从登录就是图形介面,请问如何在图形介面内进入命令行方式呢,谢谢
  • 请问玩过SOLARIS的高手门,在不正常关机后,就不能启动到windows公用桌面了,只能在命令提示模式下了,请问怎么解决这个问题啊?急~!~!
  • 请问:我在redhat下装了bochs-2.2.1-1.rpm,.装了后,想设置一下,但找不到bochsrc.fda.bxrc,请问这个文件在哪个曰录下啊。
  • 请问:在配置Qt时,很多文档都说在.profile,.login里加东西,但是我好像没有发现有这两个文件上,请问这些文件在哪个目录下啊
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 请问各位大虾,小弟今天开始学jsp了,这学期我们有java课,所以已经下载了jdk(好象是1.2),请问我的98环境怎么配置jsp环境呀?我的jdk可以运行.java程序,别的我就不知道了....谢谢!
  • 主机是WIN2000,我用的是LUNIX,请问是否可以共享上网? 如果可以请问如何设置? 500分答谢,龟儿食言!
  • 请问linux下GUI开发的问题!
  • 请问出现fstab文件丢失该怎么修复呀?
  • 请问这个方法如何调用?
  • 请问一个奇怪的问题!
  • 请问在网页中打开的新窗口,如何让其居中。
  • 请问我该学什么了
  • 请问安装zhcon,cxterm问题
  • mysql iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3