socket中accept()函数的理解

如果客户端有连接请求,必须使用下述函数来接受客户端的请求。

SOCKET accept(

       SOCKET               s,

       struct sockaddr FAR  *addr,

       int FAR          *addrlen

);

    addr用于存放客户端的地址,addrlen在调用函数时被设置为addr指向区域的长度,在函数调用结束后被设置为实际地址信息的长度。本函数会阻塞等待知道有客户端请求到达。

  返回值是一个新的套接字描述符,它代表的是和客户端的新的连接,可以把它理解成是一个客户端的socket,这个socket包含的是客户端的ip和port信息 。(当然这个new_socket会从sockfd中继承 服务器的ip和port信息,两种都有了),而参数中的SOCKET   s包含的是服务器的ip和port信息 。

  于是之后的send和recv函数中的fd都是指这个 new_fd,也就是
  int send(int new_fd, const void *msg, int len, int flags); 
  int recv(int new_fd, void *buf, int len, unsigned int flags);

  即参数其实都是目标fd(就是记录了客户端的信息 ),说明服务器是从客户端接收或者发送给客户端的。这个和文件的操作FILE *fp =fopen();   fwrite(fp,xx,xx,xx);是差不多的,这里的fp代表的也是目标即目标文件名。

  这样,客户端的 connect函数 ,
  int connect (int sockfd, struct sockaddr *serv_addr, int addrlen);
  这里的sockfd 就把客户端的ip和port  ,服务器的ip和port信息都有了。所以之后的 send(),recv()都有信息了。

   ----------------------------------------------------------------------------------------------------------------------------------------------------------

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

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
accept函数是在socket编程用于接受客户端连接的函数。当服务器端创建了一个监听socket后,可以调用accept函数来等待客户端的连接请求。 accept函数的原型为: ```c int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); ``` 其,sockfd是服务器端创建的监听socket的文件描述符;addr是指向struct sockaddr类型的指针,用于存储客户端的IP地址和端口号;addrlen是一个指向socklen_t类型的指针,用于存储客户端地址结构体的长度。 accept函数的工作流程如下: 1. 服务器调用listen函数socket设置为监听状态,等待客户端连接。 2. 当有客户端发起连接请求时,服务器调用accept函数进行处理。 3. accept函数会阻塞等待,直到有客户端连接请求到达。 4. 当有连接请求到达时,accept函数会创建一个新的socket,并返回该新socket的文件描述符。 5. 这个新的socket会与客户端建立连接,服务器端可以通过该socket与客户端进行通信。 6. 同时,accept函数会将客户端的IP地址和端口号存储在addr参数所指向的结构体,并将结构体的长度存储在addrlen参数。 需要注意的是,accept函数在没有新的连接请求到达时会一直阻塞等待,直到有新的连接请求才会返回。如果需要非阻塞地等待连接请求,可以通过设置socket为非阻塞模式或者使用select函数来实现。另外,accept函数一般会在一个循环使用,以便持续接受客户端的连接请求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值