博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
accept函数
阅读量:5872 次
发布时间:2019-06-19

本文共 1997 字,大约阅读时间需要 6 分钟。

accept()函数 

       系统调用 accept() 会有点古怪的地方的!

       你能够想象发生 这种事情:有人从非常远的地方通过一个你在侦听 (listen()) 的port连接 (connect()) 到你的机器。它的连接将增加到等待接受 (accept()) 的队列 中。

       你调用 accept() 告诉它你有空暇的连接。它将返回一个新的套接字文 件描写叙述符!这样你就有两个套接字了,原来的一个还在侦听你的那个port, 新的在准备发送 (send()) 和接收 ( recv()) 数据。这就是这个过程! 

       函数是这样定义的: 

#include 
int accept(int sockfd, void *addr, int *addrlen);
       sockfd 相当简单,是和 listen() 中一样的套接字描写叙述符。

       addr 是个指向局部的数据结构 sockaddr_in 的指针。这是要求接入的信息所要去的地 方(你能够測定那个地址在那个port呼叫你)。

       在它的地址传递给 accept 之 前,addrlen 是个局部的整形变量,设置为 sizeof(struct sockaddr_in)。  accept 将不会将多余的字节给 addr。假设你放入的少些,那么它会通过改变 addrlen 的值反映出来。 

       在错误时返回-1,并设置全局错误变量 errno。

        如今是你应该熟悉的代码片段。 

#include 
#include
#include
#define MYPORT 3490 /*用户接入端口*/ #define BACKLOG 10 /* 多少等待连接控制*/ main() { int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ struct sockaddr_in my_addr; /* 地址信息 */ struct sockaddr_in their_addr; /* connector's address information */ int sin_size; sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 错误检查*/ my_addr.sin_family = AF_INET; /* host byte order */ my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */ /* don't forget your error checking for these calls: */ bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); listen(sockfd, BACKLOG); sin_size = sizeof(struct sockaddr_in); new_fd = accept(sockfd, &their_addr, &sin_size);

        注意,在系统调用 send() 和 recv() 中你应该使用新的套接字描写叙述符 new_fd。假设你仅仅想让一个连接进来,那么你能够使用 close() 去关闭原 来的文件描写叙述符 sockfd 来避免同一个port很多其它的连接。

        当你第一次调用 socket() 建立套接口描写叙述符的时候,内核就将他设置为堵塞。假设你不想套接口堵塞,你就要调用函数 fcntl():

        通过设置套接口为非堵塞,你可以有效地"询问"套接口以获得信息,可是一般来说轮询不是一个好主意,会浪费cpu时间,

        更好的方法是用 select()方法 去查询是否有数据要读进来

        select()--多路同步 I/O

        select() 让你能够同一时候监视多个套接口。假设你想知道的话,那么他就会告诉你哪个套接口准备读,哪个又准备好了写,哪个套接口又发生了例外 (exception)。

        int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

转载地址:http://suhnx.baihongyu.com/

你可能感兴趣的文章
远程协助
查看>>
Scrum实施日记 - 一切从零开始
查看>>
关于存储过程实例
查看>>
配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
查看>>
AIX 7.1 install python
查看>>
PHP盛宴——经常使用函数集锦
查看>>
重写 Ext.form.field 扩展功能
查看>>
Linux下的搜索查找命令的详解(locate)
查看>>
福利丨所有AI安全的讲座里,这可能是最实用的一场
查看>>
开发完第一版前端性能监控系统后的总结(无代码)
查看>>
Python多版本情况下四种快速进入交互式命令行的操作技巧
查看>>
MySQL查询优化
查看>>
【Redis源码分析】如何在Redis中查找大key
查看>>
关于链接文件的探讨
查看>>
android app启动过程(转)
查看>>
Linux—源码包安装
查看>>
JDK8中ArrayList的工作原理剖析
查看>>
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
Applet
查看>>