socket编程之 accept函数的理解
在进入我们的正题之前,再来复习一波编写服务器的函数流程吧
服务器端:socket()-->bind( )-->listen()-->accept()-->read()/write()--->close()socket()//创建套接字
bind()//分配套接字地址
listen()//等待连接请求状态
accept()//允许连接
read()/write()//进行数据交换
close()//断开连接
socket()//创建套接字
bind()//分配套接字地址
listen()//等待连接请求状态
相信大家都不陌生了。所以博主就接着讲解 listen()函数的那一篇博客讲起了。其实listen() 和 accept()联系是很紧密的。
请大家要明白这一点: socket三次握手是在listen中完成,accept只从完成连接的队列中拿出一个连接
好了,那我们就来介绍 accept()函数吧。
受理客户端连接请求
#include<sys/socket.h>int accept(int sockfd, struct spckaddr *addr, skcklen_t *sddlen);参数:第一个参数: int sockfd:--->服务器套接字的文件描述符第二个参数: struct spckaddr *addr--->保存发起连接请求的客户端地址信息的变量地址值,也就是返回链接客户端地址信息,含IP地址和端口号需要强制转换类型,之前讲过第三个参数: skcklen_t *sddlen--->传入sizeof(addr)第二个参数的大小,函数返回时返回真正接收到地址结构体的大小值得一提的是第二个参数和第三个参数:第二个参数:传出参数,返回的连接成功的信息,所以我们不需要对这个套接字进行初始化。第三个参数:传入传出参数,一开始传入一个参数防止溢出,调用完成之后长度会发生改变。因为是类型不是int 所以我们一般会在前面定义一个 skcklen_t 变量来衡量大小。
第三个参数具体使用:
skcklen_t = cliaddr_len;
cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);//因为是传入传出所以需要涉及修改值,所以传入地址。
返回值:成功:成功返回一个新的socket文件描述符,用于和客户端通信。失败:返回-1,设置errno
三方握手完成后,服务器调用accept()接受连接,如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来
如图展示了“冲等待队列中取出一个连接请求,创建套接字并完成连接请求的”过程。
书中对于这些讲的已经很详细了,所以没啥好扩充的内容所以博主就把一般的服务器结构列出来:
......skcklen_t = cliaddr_len;
while (1) {cliaddr_len = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);//connfd就是和客户端沟通的套接字。n = read(connfd, buf, MAXLINE);......close(connfd);
}
这一篇博客基本上就要结束了,博主带大家分析一下服务器端代码吧。
(75条消息) socket编程之 accept函数的理解_dearQiHao的博客-CSDN博客
socket编程之 accept函数的理解相关推荐
- socket编程之accept()函数
名称 accept() 接收一个套接字中已建立的连接 使用格式 #include <sys/types.h> #include <sys/socket.h> int accep ...
- socket编程之 connect()函数
再讲了服务器端的函数调用之后,终于来到了我们的客户端编程了(read/write之后会详细介绍的),客户端编程相较于服务器端来说是非常简单的了,在掌握了服务器端编程之后再看客户端编程就会胸有成竹(只需 ...
- TCP/IP编程之accept函数详解
accept函数由TCP服务器调用,用于从已完成连接队列返回下一个已完成连接.如果已完成连接队列为空,那么进程被投入睡眠(假定套接字默为默认的阻塞方式) 函数原型: ACCEPT(2) Linux P ...
- 网络编程之accept函数和accept函数在三次握手中的位置
accept函数实际上是在三次握手之后,具体原因请看文章结尾具体解释. 基本TCP客户端/服务器程序的套接字函数 accept函数由TCP服务器调用,用于从已完成连接队列队头返回下一个已完成连接(从这 ...
- 基于Linux的Socket编程之TCP全双工Server-Client聊天程序
转载:http://blog.csdn.net/apollon_krj/article/details/53437764#0-tsina-1-58570-397232819ff9a47a7b7e80a ...
- 老雷socket编程之PHP利用socket扩展实现聊天服务
老雷socket编程之PHP利用socket扩展实现聊天服务 socket聊天服务原理 PHP有两个socket的扩展 sockets和streams sockets socket_create(AF ...
- linux编程之pthread_create函数
linux编程之pthread_create函数UNIX环境创建线程函数, 具体格式: #include<pthread.h> int pthread_create(pthread_t * ...
- [深入浅出WP8.1(Runtime)]Socket编程之UDP协议
13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...
- Linux下socket编程之UDP简单实现
本文实现一个简单的UDP小例子,来说明Linux下socket编程之UDP的简单实现.本文主要包括三个部分:服务器端的实现,客服端的实现和通信测试.实现的功能:客服端发送一条消息给服务器端,服务器端把 ...
最新文章
- Ubuntu 12.04下玩转终端管理器Byobu
- 职称计算机考试题纲,2017年职称计算机考试大纲
- 流程控制--for序列
- 开发日记-20190807 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 21
- OpenCASCADE:形状愈合之形状加工
- openresty完全开发指南_FDA拟修订群体药代动力学指南:医药商需要了解些什么?...
- 工程实践:基于规则句法的事件关系与主谓宾三元组抽取项目实现
- 不要62(HDU-2089)
- 史上最强图,图解:大厂面试题,Young GC和Full GC分别在什么情况下会发生?
- LeetCode(183)—— 从不订购的客户(MySQL)
- win11菜单怎么添加快捷方式 Windows11开始菜单添加快捷方式的设置方法
- 怎样获取用户的真实需求
- IEBrowser IE升级工具 下载
- Linux 语言包的安装
- Windows11彻底卸载Edge
- 原型设计工具Axure
- 头指针、头节点、首元结点——《王道数据结构》
- [JAVA冷知识]什么是逆变(contravariant)与协变(covariant)?数组是否支持协变逆变?泛型呢?
- Android开发俄罗斯方块
- React + Springboot + Quartz,从0实现Excel报表自动化