accept函数介绍
发布日期:2021-07-01 04:29:05
浏览次数:2
分类:技术文章
本文共 983 字,大约阅读时间需要 3 分钟。
文章目录
1 accept函数介绍
#include/* See NOTES */#include int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);/*sockdf: socket文件描述符addr: 传出参数,返回链接客户端地址信息,含IP地址和端口号addrlen: 传入传出参数(值-结果),传入sizeof(addr)大小,函数返回时返回真正接收到地址结构体的大小返回值: 成功返回一个新的socket文件描述符,用于和客户端通信,失败返回-1,设置errno */
三次握手完成后,服务器调用accept()接受连接,如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来。addr是一个传出参数,accept()返回时传出客户端的地址和端口号。addrlen参数是一个传入传出参数(value-result argument),传入的是调用者提供的缓冲区addr的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区)。如果给addr参数传NULL,表示不关心客户端的地址。
我们的服务器程序结构是这样的:
while (1) { cliaddr_len = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len); n = read(connfd, buf, MAXLINE); ...... close(connfd);}
整个是一个while死循环,每次循环处理一个客户端连接。由于cliaddr_len是传入传出参数,每次调用accept()之前应该重新赋初值。accept()的参数listenfd是先前的监听文件描述符,而accept()的返回值是另外一个文件描述符connfd,之后与客户端之间就通过这个connfd通讯,最后关闭connfd断开连接,而不关闭listenfd,再次回到循环开头listenfd仍然用作accept的参数。accept()成功返回一个文件描述符,出错返回-1。
参考资料:
转载地址:https://muzimin.blog.csdn.net/article/details/107706454 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年05月01日 15时05分29秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
google app engine 调试方法
2021-07-05
python 的日志logging模块
2021-07-05
python各种类型转换-int,str,char,float,ord,hex,oct等
2021-07-05
Python字符串格式化
2021-07-05
C语言结构体及其成员地址的互算
2021-07-05
TCP/IP通信程序设计的丰富多样性(长短连接、同步异步等)
2021-07-05
Linux下的同步与异步
2021-07-05
TCP长连接与短连接的区别
2021-07-05
Apache 的hook 一览
2021-07-05
apache+mod_perl防盗链
2021-07-05
apache 模块编写(c++)
2021-07-05
Json_c++ json api 的个人总结
2021-07-05
提领类型双关的指针将破坏重叠规则——strict-aliasing
2021-07-05
Git常用命令解说
2021-07-05
HTML5 LocalStorage 本地存储
2021-07-05
Ajax中的XMLHttpRequest对象详解
2021-07-05
HTML获取URL传递的参数
2021-07-05
javacript之cookie
2021-07-05
HTML技巧总结
2021-07-05