我正在MacOS(FreeBSD)和Linux下构建一个跨平台套接字程序,就像这样
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
int main(void) {
fd_set rfds;
fd_set wfds;
struct timeval tv;
int retval;
int fd = socket(AF_INET, SOCK_STREAM, 0);
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_SET(fd, &rfds);
FD_SET(fd, &wfds);
tv.tv_sec = 1;
tv.tv_usec = 0;
retval = select(fd + 1, &rfds, &wfds, NULL, &tv);
printf("ready sockets = %d\n", retval);
exit(EXIT_SUCCESS);
}
非常简单,它会创建socket
,并使用select
来查看它是可读还是可写。
如果我在MacOS下运行
ready sockets = 0
您将看到程序块1秒钟,并打印出套接字就绪。但是如果你在Linux下运行它,你会看到它打印出来
ready sockets = 2
立即。这对我来说听起来很奇怪,因为套接字刚刚创建,没有什么可读或写的,但是select
函数告诉我它已经准备好读写了,为什么它们的表现会有所不同?