当前位置:  技术问答>linux和unix

关于accept函数的一点迷惑!

    来源: 互联网  发布时间:2015-11-13

    本文导语:  在socket编程中,有几个问题想请教一下。    绑定socket后用listen函数去监听,如果有连接请求就把该请求放到等待队列里,等待accept函数来接收。一旦accept接收成功就创建一个新的socket来处理与client的通讯。    我...

在socket编程中,有几个问题想请教一下。
   绑定socket后用listen函数去监听,如果有连接请求就把该请求放到等待队列里,等待accept函数来接收。一旦accept接收成功就创建一个新的socket来处理与client的通讯。
   我想问的是accept从等待队列里取出请求连接的信息后,是否把该请求信息从队列里删除呢?
  哪位大侠能给小弟详细的说说accept函数的执行过程。谢谢了!

|
要原理还是实现?原理就是TCP三次握手,实现需要看源码:)

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

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

|
应该会删了

    
 
 

您可能感兴趣的文章:

  • 请教一个网络编程问题,accept函数的,在线等,急。。。
  • accept函数为何返回0???
  • 请教LINUX 中 服务端 accept 函数
  • 在sockets中的Connect()/Accept()这样的包裹函数
  • accept函数的问题
  • java 中 SOCKET 的ACCEPT函数有返回值吗?怎样返回才是正常的?
  • linux网络编程里面,accept(listen_fd,NULL,NULL)函数的地址参数为NULL是什么意思?
  • Linux 中c网络编程,accept函数的问题,请大家指点,谢谢
  • 为何我close了 accept不立即返回 iis7站长之家
  • 关于accept()函数能产生多少个套接字和在LINUX 能产生多少个线程
  • accept函数的阻塞问题
  • 调用ACE_SSL_SOCK_Acceptor::accept函数的时候,进程死掉(在一个死循环中不断的调用accept,程序运行一段时间后,就会死掉)
  • 小白请教关于Listen、accept、信号处理函数、waitpid的几个问题
  • socket 编程中的 Accept函数问题
  • 帮忙看下socket中的accept函数的问题(只剩30分了,大家别嫌少哈)
  • accept函数没有返回
  • 通过accept函数得到的端口不正确!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类httpurlconnection的类成员方法: http_accepted定义及介绍
  • socket accept问题,大家指教。
  • java命名空间java.awt.event类keyevent的类成员方法: vk_accept定义及介绍
  • Accept() 返回0,请问是怎么回事 ?
  • java命名空间java.net类httpurlconnection的类成员方法: http_not_acceptable定义及介绍
  • iptables的默认策略与accept的疑问
  • java命名空间javax.swing类jfilechooser的类成员方法: accept定义及介绍
  • 初学socket,求教关于listen和accept关系的问题。
  • java命名空间java.net接口cookiepolicy的类成员方法: accept_none定义及介绍
  • accept的多线程在这里是如何体现的?
  • java命名空间java.net接口cookiepolicy的类成员方法: accept_all定义及介绍
  • accept返回-1的原因
  • java命名空间java.net类socketimpl的类成员方法: accept定义及介绍
  • 为何我close了 accept不立即返回
  • java命名空间javax.xml.stream接口eventfilter成员方法: accept定义参考
  • socket编程select对accept的影响
  • java命名空间java.io接口filefilter的类成员方法: accept定义及介绍
  • 用accept系统调用得到的socket能用在readv和writev上吗?
  • java命名空间javax.xml.stream接口streamfilter成员方法: accept定义参考
  • accept,recvfrom接收到奇怪的ip
  • java命名空间java.io接口filenamefilter的类成员方法: accept定义及介绍
  • 新手请教一个select accept 问题 ?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3