1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 运维 - 正文

君子好学,自强不息!

Linux Accept函数简单介绍

2022-11-08 | 运维 | gtxyzz | 624°c
A+ A-

系统调用accept()会有点古怪的地方的!你可以想象发生这样的事情:有人从很远的地方通过一个你在侦听(listen())的端口连接(connect())到你的机器。它的连接将加入到等待接受(accept())的队列中。你调用accept()告诉它你有空闲的连接。它将返回一个新的套接字文件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口,新的在准备发送(send())和接收(recv())数据。这就是Linux Accept函数的过程!

Linux Accept函数是这样定义的: #include<sys/socket.h> intaccept(intsockfd,void*addr,int*addrlen);

sockfd相当简单,是和listen()中一样的套接字描述符。addr是个指向局部的数据结构sockaddr_in的指针。这是要求接入的信息所要去的地方(你可以测定那个地址在那个端口呼叫你)。在它的地址传递给accept之前,addrlen是个局部的整形变量,设置为sizeof(structsockaddr_in)。accept将不会将多余的字节给addr。如果你放入的少些,那么它会通过改变addrlen的值反映出来。同样,在错误时返回-1,并设置全局错误变量errno。 现在是你应该熟悉的代码片段。

#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#defineMYPORT3490/*用户接入端口*/ 
#defineBACKLOG10/*多少等待连接控制*/ 
main() 
{ 
intsockfd,new_fd;/*listenonsock_fd,newconnectiononnew_fd*/ 
structsockaddr_inmy_addr;/*地址信息*/ 
structsockaddr_intheir_addr;/*connector'saddressinformation*/ 
intsin_size; 
sockfd=socket(AF_INET,SOCK_STREAM,0);/*错误检查*/ 
my_addr.sin_family=AF_INET;/*hostbyteorder*/ 
my_addr.sin_port=htons(MYPORT);/*short,networkbyteorder*/ 
my_addr.sin_addr.s_addr=INADDR_ANY;/*auto-fillwithmyIP*/ 
bzero(&(my_addr.sin_zero),;/*zerotherestofthestruct*/ 
/*don'tforgetyourerrorcheckingforthesecalls:*/ 
bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr)); 
listen(sockfd,BACKLOG); 
sin_size=sizeof(structsockaddr_in); 
new_fd=accept(sockfd,&their_addr,&sin_size); 
. 
. 
. 

Linux Accept函数注意事项,在系统调用send()和recv()中你应该使用新的套接字描述符new_fd。如果你只想让一个连接进来,那么你可以使用close()去关闭原来的文件描述符sockfd来避免同一个端口更多的连接。

本文来源:1818IP

本文地址:https://www.1818ip.com/post/7955.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。