accept()函数说明

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


  函数是这样定义的:    


  #include   <sys/socket.h>    
  int   accept(int   sockfd,   void   *addr,   int   *addrlen);    


  sockfd   相当简单,是和   listen()   中一样的套接字描述符。

addr   是个指   向局部的数据结构   sockaddr_in   的指针。这是要求接入的信息所要去的地   方(你可以测定那个地址在那个端口呼叫你)。在它的地址传递给   accept   之   前,addrlen   是个局部的整形变量,设置为   sizeof(struct   sockaddr_in)。   accept   将不会将多余的字节给   addr。如果你放入的少些,那么它会通过改 变   addrlen   的值反映出来。    


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

  
  现在是你应该熟悉的代码片段。    
  #include   <string.h>    
  #include   <sys/socket.h>    
  #include   <sys/types.h>    
  #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   来避免同一个端口更多的连接。

 

accept是阻塞函数,当监听socket调用accept时,它先到自己的receive_buf中查看是否有连接数据包,若有,把数据拷贝出来,删掉收到的数据包,创建新的socket与客户发来的地址建立连接。  
  若没有数据,那就阻塞等待。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值