tcp连接中的listen()与accept()
来源:互联网 发布:php 500错误日志 编辑:程序博客网 时间:2024/06/05 11:39
int listen(int sockfd, int backlog);
作用:通知服务端准备接受套结字上的连接请求。<<tcp/IP详解卷二>>364页原话.
感觉说的很浅,具体是怎么准备的呢?
先说结论: listen()调用完毕,生成一个大小为backlog*3/2的等待队列(队列的长度,不同系统可能会有差异,我用的是红帽7.1),这时客户端如果调用connect()并且队列没满则TCP连接直接就建立好了(三次握手建立双向连接).如果队列已经满了则服务段拒绝建立新的TCP连接. 实际上调用一次accept()是从该队列取出一个客户端的socketfd返回,同时队列的容量也会减一,如果队列为空,则accept()就会阻塞.
上一段代码证明结论!
服务端:server.c
#include<myc.h> //该头文件是我自己封装并放到/usr/include下的一个头文件
#define PORT 9898
#define LOCAL_IP "127.0.0.1"
int main(int argc,char **argv)
{
struct sockaddr_in local;
int sockfd;
int on=1;
socklen_t len;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))){
perror("error in setsockopt()!");
return -1;
}
len = sizeof(struct sockaddr_in);
memset(&local,0,len);
local.sin_family = AF_INET;
local.sin_port = htons(PORT);
inet_aton(LOCAL_IP,&local.sin_addr);
if(-1 == (bind(sockfd,(struct sockaddr *)&local,len))){
perror("error in bind()!");
return -1;
}
if(-1 == (listen(sockfd,2))){
perror("error in listen()!");
return -1;
}
pause();
return 0;
}
客户端:client.c
#include<myc.h>
int main()
{
struct sockaddr_in cli;
int sockfd;
head_inf inf;
sockfd = socket(AF_INET,SOCK_STREAM,0);
memset(&cli,0,sizeof(cli));
cli.sin_family = AF_INET;
cli.sin_port = htons(9898);
cli.sin_addr.s_addr = inet_addr("127.0.0.1");
if(-1 == connect(sockfd,(struct sockaddr *)&cli,sizeof(cli))){
printf("%s\n",strerror(errno));
return 2;
}
pause();
return 0;
}
gcc client.c -o client
gcc server.c -o server
listen的第二个参数是2,则队列容量最大为3.开启3个bash并执行 ./client 执行netstat -nt查看tcp连接的状态
当开启第4个client时
我们发现第四个TCP连接没有成功建立,只是一个半连接!
的状 另外再说一下accept(),该函数仅仅是从以连接队列中取出客户端的socket描述符.<<linux高性能服务器编程>>上也给出了一个例子:
服务端server.c
......
listen(sockfd,2);
sleep(20);
int new_sockfd = accept(sockfd,(struct sockaddr_in *)&client,&sockaddr_length);
......
现在让客户端在服务端sleep(20)期间 断开网线或关闭客户端程序,结果丝毫不影响服务端accept并获取客户端的socket描述符.
- tcp连接中的listen()与accept()
- tcp listen和accept过程
- tcp listen调用和accept调用
- listen()与accept()函数的区别
- TCP网络编程中的listen
- Linux TCP server系列(4)-浅谈listen与大并发TCP连接
- Linux TCP server系列(4)-浅谈listen与大并发TCP连接
- SOCKET accept后端口与listen绑定端口相关备注
- socket 中listen() 与accept() 的一些理解
- UDT协议实现分析——bind、listen与accept
- TCP半连接与全连接队列及accept建立连接
- 3.listen() & accept()
- TCP/IP (一) accept建立连接
- linux中TCP的socket、bind、listen、connect和accept的实现
- TCP网络编程中connect()、listen()和accept()三者之间的关系
- TCP网络编程中connect()、listen()和accept()三者之间的关系
- Linux网络协议栈之TCP socket/bind/listen/connect/accept/close/shutdown
- TCP网络编程中connect()、listen()跟accept()三者之间的关系
- BZOJ 2743 [HEOI2012]采花
- 多线程和多进程模型的选用
- 阿里云发布视频云解决方案ApsaraVideo 打造直播界的“宜家”
- 欢迎使用CSDN-markdown编辑器
- 2016/10/12
- tcp连接中的listen()与accept()
- 堆排序
- BZOJ 1911 [Apio2010]特别行动队
- 如何召回流失的用户?
- bigautocomplete的用法(包括后台数据的交互)模仿百度搜索样式
- BZOJ 1935 [Shoi2007]Tree 园丁的烦恼
- 如何在vs中添加cURL库
- POST传值
- ionic之样式bar-stable