Linux和BSD之间选择套接字的行为不一致

时间:2017-01-15 00:06:19

标签: linux macos sockets

我正在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函数告诉我它已经准备好读写了,为什么它们的表现会有所不同?

0 个答案:

没有答案