Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
非阻塞套接字的Windows select和Unix select之间的差异 我尝试从Windows平台上获得一些C++代码到Mac OSX/Linux。Windows实现使用套接字和select语句。在Windows下,指定用于选择的fd_集定义如下: typedef struct fd_set { u_int fd_count; /* how many are SET? */ SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */ } fd_set;_C++_Linux_Windows_Macos_Sockets - Fatal编程技术网

非阻塞套接字的Windows select和Unix select之间的差异 我尝试从Windows平台上获得一些C++代码到Mac OSX/Linux。Windows实现使用套接字和select语句。在Windows下,指定用于选择的fd_集定义如下: typedef struct fd_set { u_int fd_count; /* how many are SET? */ SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */ } fd_set;

非阻塞套接字的Windows select和Unix select之间的差异 我尝试从Windows平台上获得一些C++代码到Mac OSX/Linux。Windows实现使用套接字和select语句。在Windows下,指定用于选择的fd_集定义如下: typedef struct fd_set { u_int fd_count; /* how many are SET? */ SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */ } fd_set;,c++,linux,windows,macos,sockets,C++,Linux,Windows,Macos,Sockets,这是非常糟糕的,因为FD_SETSIZE很小,我必须构建一个更动态的方法,这给64位窗口带来了一些麻烦。在Windows上解决所有这些问题时,我在unix/linux/OSX上遇到了问题,因为fd_集看起来完全不同 现在是问题。是否存在windows中的套接字计数限制?什么是在Linux和Windows下工作的好解决方案。如果套接字计数有限制,那么最好的解决方法是什么?据我所知,两个操作系统都允许在包含Windows的include文件winsock.h之前通过定义FD_SETSIZE来更改结构

这是非常糟糕的,因为FD_SETSIZE很小,我必须构建一个更动态的方法,这给64位窗口带来了一些麻烦。在Windows上解决所有这些问题时,我在unix/linux/OSX上遇到了问题,因为fd_集看起来完全不同


现在是问题。是否存在windows中的套接字计数限制?什么是在Linux和Windows下工作的好解决方案。如果套接字计数有限制,那么最好的解决方法是什么?

据我所知,两个操作系统都允许在包含Windows的include文件winsock.h之前通过定义FD_SETSIZE来更改结构的大小。这意味着,如果您只是简单地将结构变大,Windows文档明确地告诉您这一点,那么Windows中就没有真正的套接字计数限制。FD_SET等函数使用FD_SET size宏,它们是内联函数,甚至只是宏

在Linux中,您也会遇到同样的问题。但是在Linux下,fd_set结构不包含计数,只包含一个位字段!因此,如果小端机器上的第一个字节是0x81,0x01,那么文件描述符0、7和8在文件描述符集中

select系统调用的第一个参数必须是位字段的长度。在Windows下,select的第一个参数应为0

正如您所看到的,Windows和Linux之间存在许多差异,因此您可能需要为closesocket/close编写一个独立于系统的包装函数:

在Linux下,检查最高的文件描述符编号。然后计算:位图大小=最大值+64&~63。分配位图大小/8字节并设置相应的位


在Windows下,您可以分配一个fd_集合结构,但有更多的fd_数组项。

Windows有用于等待套接字事件的可选API—WSAAsyncSelect和WSAEventSelect。好吧,两者都不是可移植的。没错,我知道WSAAPI。但是我已经运行了整个通信部分,除了单个select语句。如果有办法让select正确运行,我不想重写代码。FD_SETSIZE通常在*尼克斯上至少为1024,而在Windows上为64。没有解决方法,您必须切换到其他方法,例如使用poll或if 1024是不够的。