socket listen/accept

listen函数

摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。

listen函数在一般在调用bind之后-调用accept之前调用,它的函数原型是:

intlisten(int sockfd, int backlog)

参数sockfd

被listen函数作用的套接字,sockfd之前由socket函数返回。在被socket函数返回的套接字fd之时,它是一个主动连接的套接字,也就是此时系统假设用户会对这个套接字调用connect函数,期待它主动与其它进程连接,然后在服务器编程中,用户希望这个套接字可以接受外来的连接请求,也就是被动等待用户来连接。由于系统默认时认为一个套接字是主动连接的,所以需要通过某种方式来告诉系统,用户进程通过系统调用listen来完成这件事。

参数backlog

这个参数涉及到一些网络的细节。进程处理一个一个连接请求的时候,可能还存在其它的连接请求。因为TCP连接是一个过程,所以可能存在一种半连接的状态,有时由于同时尝试连接的用户过多,使得服务器进程无法快速地完成连接请求。如果这个情况出现了,服务器进程希望内核如何处理呢?内核会在自己的进程空间里维护一个队列以跟踪这些完成的连接但服务器进程还没有接手处理或正在进行的连接,这样的一个队列内核不可能让其任意大,所以必须有一个大小的上限。这个backlog告诉内核使用这个数值作为上限。

毫无疑问,服务器进程不能随便指定一个数值,内核有一个许可的范围。这个范围是实现相关的。很难有某种统一,一般这个值会小30以内。

accept函数

摘要:accept()用来接受参数s的socket连接,它的函数原型是:

intaccept(int s,struct sockaddr * addr,int * addrlen)

服务程序调用accept函数从处于监听状态的流套接字s的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符,以后与客户套接字交换数据的是新创建的套接字;如果失败就返回 INVALID_SOCKET。该函数的第一个参数指定处于监听状态的流套接字;操作系统利用第二个参数来返回新创建的套接字的地址结构;操作系统利用第三个参数来返回新创建的套接字的地址结构的长度。
时间: 2024-12-20 21:32:56

socket listen/accept的相关文章

转: 由socket的accept说开去

from: http://ticktick.blog.51cto.com/823160/779866 今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口? 讨论完后,才发现,自己虽然熟悉socket的编程套路,但是却并不是那么清楚socket的原理,今天就趁这个机会,把有关socket编程的几个疑问给搞清楚吧. 先给出一个典型的TCP/IP通信示意图. 问题一:socket结构

socket执行accept函数时没有进入阻塞状态,而是陷入了无限循环

接着前两天继续看<VC深入详解>的网络编程部分,这次我快速看了遍书上的函数以及套接字C-S模型,然后自己从0开始写了个简单的服务端,结果发现一直在输出 而明明我还没有写客户端程序,由于打印的代码只有一处,在如下的while循环里 while (true) { /* 5. 接收客户端发送的连接请求 */ SOCKET sockConnect = accept(sockServer, (SOCKADDR*)&addrClient, &len); /* 6. [发送/接收]数据 */

TCP socket的accept/connect成功返回可是对端却不辞而别

在编写TCP程序的时候,对于服务端,accept成功返回的时候,就一定意味着某个客户端已经成功建立了TCP连接吗?对于客户端,connect成功返回就一定意味着自己成功连接上服务端了么?远远不是!       accept/connect这两个socket调用完全是基于TCP三次握手状态机的,即只要本地TCP状态机进入ESTABLISH状态,就会成功返回.而我们知道,TCP的三次握手本身就是一次权衡的结果.为什么不是四次握手呢?为什么不是五次呢?...问题可以一直这么问下去.       事实上

java Socket的accept()方法 不能连续获取数据原因

服务端代码如下: 客户端代码如下: 其中 bufOut.newLine();很关键. 因为accept()方法会将回车符作为结束标志,如果没有这一行,会继续接收,不会认为客户端此次传输已结束.

socket listen参数中的backlog

服务器监听时,在每次处理一个客户端的连接时是需要一定时间的,这个时间非常的短(也许只有1ms 或者还不到),但这个时间还是存在的.而这个backlog 存在的意义就是:在这段时间里面除了第一个连接请求是正在进行处理以外,其他的连接请求都在请求队列中等待,而如果超过了队列的最大等待个数时,其他的请求将被忽略或者将不会被处理.这个backlog 的值就是影响这个队列的大小的. /proc/sys/net/core/somaxconn跟listen参数的最小值作为backlog的值.

socket listen参数中的backlog 的意义!

服务器监听时,在每次处理一个客户端的连接时是需要一定时间的,这个时间非常的短(也许只有1ms 或者还不到),但这个时间还是存在的.而这个backlog 存在的意义就是:在这段时间里面除了第一个连接请求是正在进行处理以外,其他的连接请求都在请求队列中等待,而如果超过了队列的最大等待个数时,其他的请求将被忽略或者将不会被处理. 这个backlog 的值就是影响这个队列的大小的.但是这个backlog 值的大小并非直接等于队列的个数,队列的实际大小根据操作系统的不同而不同.也许有的是这个值,有的是2 

NDK Socket编程:面向连接的通信(tcp)

使用posix socket api,java层调用c层. AndroidManifest.xml: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.apress.echo" android:versionCode="1" android:versionName="1.0" > <uses-sd

网络工具的瑞士军刀netcat

这是一个聒噪的夜晚,如果要给出个原因,可能是因为虽然我觉得西班牙不纯粹,但是怎么也不至于干为人家搭台面自己不唱戏的角色吧..结束以后,我觉得该玩一下素有网络瑞士军刀之称谓的netcat了.虽然瑞士军刀和netcat除了在小而精方面之外并没有必然的联系,但是我还是想扯一通我所了解的瑞士,博客嘛,不是论文,不是测试报告,发散一点没有问题,并且,我觉得将来,跨界将是一个必然的趋势,拥有跨界的能力也是一个必然的优势.       瑞士是一个没有历史的国家,它完全就是1848年的政治妥协的结果,这也说明了

接口处理篇 accept bind connect atan2 htons inet_addr inet_aton inet_ntoa listen ntohl recv send sendto socket

accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #include<sys/types.h> #include<sys/socket.h> 定义函数 int accept(int s,struct sockaddr * addr,int * addrlen); 函数说明 accept()用来接受参数s的socket连线.参数s的socket必需先经bind().listen()函数处理过,当有连线进来时 accept()