系统调用   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与客户发来的地址建立连接。  
  若没有数据,那就阻塞等待。

accept()函数说明相关推荐

  1. accept函数与TCP三次握手

    ❤️强烈推荐人工智能学习网站❤️ accept函数和TCP三次握手有没有关系?有什么关系?一段代码让你从此不在疑惑. 服务端: #include <unistd.h> #include & ...

  2. listen()与accept()函数的区别

    listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定 ...

  3. accept函数_基础套接字函数入门1

    想不想自己写一个简单的QQ?想不想自己写一个聊天室?想不想知道2000年的人是如何上网的?本节讲解一些基础的网络函数,带你看看,编写一个完整的TCP客户端.服务端需要掌握哪些函数?之后,我们要开发自己 ...

  4. C语言socket accept()函数(提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符)

    文章目录 名称 使用格式 功能参数描述 参数 sockfd addr addrlen 返回值 示例 man 2 文档中的accept解释 错误处理 名称 accept() 接收一个套接字中已建立的连接 ...

  5. listen()和accept()函数:让套接字进入监听状态并响应客户端请求

    对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了. listen() 函数 ...

  6. socket的accept函数解析以及服务器和多个客户端的端口问题

     今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口? 讨论完后,才发现,自 ...

  7. linux的accept函数源码,accept函数

    13.2.5  accept函数 处于监听状态的服务器在获得客户机的连接请求后,会将其放置在等待队列中.当系统空闲时,将接受客户机的连接请求.接收客户机的连接请求使用accept函数,该函数的具体信息 ...

  8. socket编程之 accept函数的理解

    在进入我们的正题之前,再来复习一波编写服务器的函数流程吧 服务器端:socket()-->bind( )-->listen()-->accept()-->read()/writ ...

  9. tcp/ip网络编程--accept()函数返回的套接字

    tcp/ip网络编程–accept()函数返回的套接字 套接字:1)套接字是对网络中不同主机的应用进程之间进行双向通信的端点的抽象:一个套接字就是网络进程通信的一端.[1] 2)套接字是用来与另一个进 ...

  10. accept函数(TCP)

    accept函数(TCP) #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int accept( ...

最新文章

  1. stm32之端口复用和重映射
  2. PHP常用功能块_错误和异常处理 — php(32)
  3. 通信 / HTTP Host 请求头的作用
  4. 现在就是.Net最好的时代!我赞成,谁反对?
  5. oracle存储过程的写法
  6. centos6.5 nginx1.8 php mysql,CentOS6.5 源码安装Nginx1.8 + PHP7.0.6 + MySQL5.7.12
  7. 特斯拉:芯片短缺至移动充电连接器涨价
  8. ubuntu 18.04 安装 LNMP后,nginx 和 apachae 冲突
  9. 计算机职称考试如何知道这道题对错,职称计算机考试Excel判断试题2017
  10. fedora 18 视频解码器安装
  11. Spark常用端口号
  12. 售前是做什么的?需要具备什么能力?
  13. java 证书错误_java – SSL证书错误:certificate_unknown
  14. 深入理解Plasma(四)Plasma Cash
  15. 网络劫持问题都应该如何解决?
  16. 2022半入耳式蓝牙耳机怎么选?半入耳式耳机排行榜
  17. 输入身份证号自动算出年龄,出生日期,性别
  18. 计算广告(一):在线广告概述
  19. Maven环境搭建及配置
  20. 使用PS批量处理图片大小

热门文章

  1. oracle ppt讲义,oracle课件.ppt
  2. Python+uiautomator2指定区域截图
  3. windows无法格式化u盘_u盘无法格式化怎么办 DOS下u盘格式化方法【详解】
  4. 建议收藏 | IC专业术语盘点
  5. Python图像处理(13):brisk特征检测
  6. Redis的安装和卸载--linux环境MobaXterm操作
  7. multiple definition of...
  8. 一个强悍的web性能测试工具--WebPageTest
  9. Windows XP SP3 IIS HTTP 500 - 内部服务器错误解决
  10. Qt QSqlQueryModel实现查询数据库内容