Linux socket accept功能的作用是在服务器端等待并接受客户端的连接请求。当有客户端尝试连接服务器时,服务器调用accept函数来接受该连接请求,并创建一个新的socket来与该客户端进行通信。
具体来说,accept函数被动监听客户端的三次握手连接请求,三次握手成功即建立连接成功。所谓“新的”是说这个套接字与socket()返回的用于监听和接受客户端的连接请求的套接字不是同一个套接字。与本次接受的客户端的通信是通过在这个新的套接字上发送和接收数据来完成的。
FD_ZERO
,FD_SET
和FD_ISSET
是用于处理文件描述符集合的函数,它们是UNIX和类UNIX系统(如Linux)中的系统调用。这些函数主要用于socket编程,特别是在处理多路复用(multiplexing)的情况下。
FD_ZERO(fd_set *set)
: 这个宏用于清空一个文件描述符集。它将set
指向的集初始化为空集。fd_set rdfs;
FD_ZERO(&rdfs);
FD_SET(int fd, fd_set *set)
: 这个宏用于将指定的文件描述符添加到指定的文件描述符集中。如果文件描述符fd
不在set
指向的集中,那么它就被添加进去;如果它已经在集合中,那么集合的状态不会改变。fd_set rdfs;
int listen_sock = socket(AF_INET, SOCK_STREAM, 0); // 创建一个socket
FD_SET(listen_sock, &rdfs); // 将socket的文件描述符添加到集合中
FD_ISSET(int fd, fd_set *set)
: 这个宏用于检查指定的文件描述符是否在给定的文件描述符集中。如果文件描述符在集合中,那么返回非零值;否则返回0。fd_set rdfs;
int listen_sock = socket(AF_INET, SOCK_STREAM, 0); // 创建一个socket
FD_SET(listen_sock, &rdfs); // 将socket的文件描述符添加到集合中
if (FD_ISSET(listen_sock, &rdfs)) { // 检查socket的文件描述符是否在集合中
// do something if it is in the set
}
这三个函数的主要区别在于它们的作用:
FD_ZERO
用于清空一个文件描述符集FD_SET
用于将一个文件描述符添加到一个文件描述符集FD_ISSET
用于检查一个文件描述符是否在一个文件描述符集注意:在使用这些函数时,必须保证文件描述符集已经被正确地初始化(例如,使用FD_ZERO
进行初始化),并且要保证添加或检查的文件描述符是有效的。同时,这些函数都属于POSIX API的一部分,因此在某些非POSIX系统上可能无法使用。