0

I try to get some C++ code from Windows platform to Mac OSX/Linux. The Windows implementation uses sockets and the select statement. Under Windows the fd_set given to select is defined as followed:

typedef struct fd_set {
        u_int fd_count;               /* how many are SET? */
        SOCKET  fd_array[FD_SETSIZE];   /* an array of SOCKETs */
} fd_set;

which is pretty bad, because FD_SETSIZE is small and I had to build a more dynamic approach which gives some trouble on 64bit Windows. Resolving all these problems on Windows, I run into problems on unix/linux/OSX because the fd_set looks there totally different.

Now the question. Is there a socket count limitation like in windows? What is a good solution work under Linux and Windows. If there is a limitation in socket count, what is the best workaround?

4

1 回答 1

1

据我所知,两个操作系统都允许在包含#include 文件(Windows 的winsock.h)之前通过#defining FD_SETSIZE 来更改结构的大小。这意味着如果您只是使结构更大,Windows 中没有真正的套接字计数限制(Windows 文档明确说明了这一点)。FD_SET() 等函数使用 FD_SETSIZE 宏(它们是“内联”函数,甚至只是宏)。

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

“select()”系统调用的第一个参数必须是位域的长度。在 Windows 下,“select()”的第一个参数应该是 0。

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

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

在 Windows 下,您分配一个 fd_set 结构,但具有更多 fd_array 条目。

于 2013-09-30T20:05:44.823 回答