listen(等待连接)
相关函数 socket,bind,accept,connect
表头文件 #include<sys/socket.h>
定义函数 int listen(int s,int backlog);
函数说明 listen()用来等待参数s 的socket连线。参数backlog指定同时能处
理的最大连接要求,如果连接数目达此上限则client端将收到
ECONNREFUSED的错误。Listen()并未开始接收连线,只是设置
socket为listen模式,真正接收client端连线的是accept()。通常
listen()会在socket(),bind()之后调用,接着才调用accept()。
返回值 成功则返回0,失败返回-1,错误原因存于errno
附加说明 listen()只适用SOCK_STREAM或SOCK_SEQPACKET的socket类型。如果socket为AF_INET则参数backlog 最大值可设至128。
错误代码 EBADF 参数sockfd非合法socket处理代码
EACCESS 权限不足
EOPNOTSUPP 指定的socket并未支援listen模式。

================================================================================

范例:

#include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> #define PORT 1234 #define MAXSOCKFD 10 main() { int sockfd,newsockfd,is_connected[MAXSOCKFD],fd; struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr_in); fd_set readfds; char buffer[256]; char msg[ ] =”Welcome to server!”; if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){ perror(“socket”); exit(1); } bzero(&addr,sizeof(addr)); addr.sin_family =AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sockfd,&addr,sizeof(addr))<0){ perror(“connect”); exit(1); } if(listen(sockfd,3)<0){ perror(“listen”); exit(1); } for(fd=0;fd<MAXSOCKFD;fd++) is_connected[fd]=0; while(1){ FD_ZERO(&readfds); FD_SET(sockfd,&readfds); for(fd=0;fd<MAXSOCKFD;fd++) if(is_connected[fd]) FD_SET(fd,&readfds); if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue; for(fd=0;fd<MAXSOCKFD;fd++) if(FD_ISSET(fd,&readfds)){ if(sockfd = =fd){ if((newsockfd = accept (sockfd,&addr,&addr_len))<0) perror(“accept”); write(newsockfd,msg,sizeof(msg)); is_connected[newsockfd] =1; printf(“cnnect from %s\n”,inet_ntoa(addr.sin_addr)); }else{ bzero(buffer,sizeof(buffer)); if(read(fd,buffer,sizeof(buffer))<=0){ printf(“connect closed.\n”); is_connected[fd]=0; close(fd); }else printf(“%s”,buffer); } } } } 执行 $ ./listen connect from 127.0.0.1 hi I am client connected closed.

linux listen()的更多相关文章

  1. 深入探索 Linux listen() 函数 backlog 的含义

    1:listen()回顾以及问题引入 2:正确的解释 3:实验验证 1:listen()回顾以及问题引入 listen()函数是网络编程中用来使服务器端开始监听端口的系统调用,首先来回顾下listen ...

  2. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  3. 【uWSGI】实战之Django配置经验

    uWSGI 是应用服务器,实现了uwsgi, wsgi等协议,可以运行wsgi 应用 uwsgi 是协议名 Django配置 下面是自己经常用的一个配置模板,基于1.9以上的版本使用的, 主要基于dj ...

  4. connect & send 在三次握手过程中的有趣问题

    一.问题回顾 面试的时候被问到的问题,原问题是: 1:写一下socket网络编程服务端和客户端常用的函数. 2:如果服务端在listen之后没有accept,那客户端的connect会返回吗?为什么? ...

  5. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  6. 【Linux 网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...

  7. linux tcp listen函数的参数backlog

    1 listen函数(http://man7.org/linux/man-pages/man2/listen.2.html) int listen(int sockfd, int backlog); ...

  8. 从Linux源码看Socket(TCP)的listen及连接队列

    从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...

  9. Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()

    前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...

随机推荐

  1. iOS开发-NSString去掉所有换行及空格

    1.去掉字符串两端的空格及回车 - (NSString *)removeSpaceAndNewline:(NSString *)str{ NSString *temp = [str stringByT ...

  2. android 动画总结一

    一.补间动画 补间动画就是指开发者指定动画的开始.动画的结束的"关键帧",而动画变化的"中间帧"由系统计算,并补齐. 补间动画分为四种:平移动画(Transla ...

  3. centos7 配置yum源

    简单粗暴方法: 1.首先在本机上测试 ping www.baidu.com 是否通,不通的话配置网卡ip.dns等. 2.进入yum路径下: cd /etc/yum.repos.d/ 3.下载repo ...

  4. Android面试题 请解释下单线程模型中Message、Handler、MessageQueue、Looper之间的关系

    简单的说,Handler获取当前线程中的looper对象,looper用来存放从MessageQueue中取出的Message,再由Handler进行Message分发和处理,按照先进先出执行. Me ...

  5. Python语言程序设计:Lab4

    Programming 1.Analysing a Text File Look at the file xian_info.txt which is like this: Xi'an China 8 ...

  6. ASP.NET六大巨头——内置对象(2)

    前面讲了三个内置对象,后面来探究一下另外三个内置对象Session.Server和Cookie,Session对象就是服务器给客户端的一个编号:Server对象提供对服务器上的方法和属性的访问:coo ...

  7. element-ui upload组件 onchange事件 传自定义参数

     <el-upload     class="upload-demo"     list-type="picture"     accept=" ...

  8. element ui框架把el-select选中的value设置为对象

  9. C# TreeView 右键菜单

    方法一: 在winform中,添加一个contextMenuStrip1,设置TreeView的属性ContextMenuStrip为contextMenuStrip1,并为这个contextMenu ...

  10. rest_framework/api.html

    解决办法 在setting.py文件中添加 'rest_framework' 注册这个应用 INSTALLED_APPS = [ 'django.contrib.admin', 'django.con ...