accept函数介绍

文章目录

1 accept函数介绍

#include <sys/types.h> 		/* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

/*
sockdf:
	socket文件描述符
addr:
	传出参数,返回链接客户端地址信息,含IP地址和端口号
addrlen:
	传入传出参数(值-结果),传入sizeof(addr)大小,函数返回时返回真正接收到地址结构体的大小
返回值:
	成功返回一个新的socket文件描述符,用于和客户端通信,失败返回-1,设置errno
	*/

在这里插入图片描述

三次握手完成后,服务器调用accept()接受连接,如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来。addr是一个传出参数,accept()返回时传出客户端的地址和端口号。addrlen参数是一个传入传出参数(value-result argument),传入的是调用者提供的缓冲区addr的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区)。如果给addr参数传NULL,表示不关心客户端的地址。

我们的服务器程序结构是这样的:

while (1) {
	cliaddr_len = sizeof(cliaddr);
	connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
	n = read(connfd, buf, MAXLINE);
	......
	close(connfd);
}

整个是一个while死循环,每次循环处理一个客户端连接。由于cliaddr_len是传入传出参数,每次调用accept()之前应该重新赋初值。accept()的参数listenfd是先前的监听文件描述符,而accept()的返回值是另外一个文件描述符connfd,之后与客户端之间就通过这个connfd通讯,最后关闭connfd断开连接,而不关闭listenfd,再次回到循环开头listenfd仍然用作accept的参数。accept()成功返回一个文件描述符,出错返回-1。


参考资料:

  1. C/C++从入门到精通-高级程序员之路【奇牛学院】
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函数一般会在一个循环中使用,以便持续接受客户端的连接请求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值