Подскажите пожалуйста где я могу найти макросы для работы со структурой fd_set (FD_ZERO, FD_ISSET ... ) или хотя бы описание того, как правильно с ней обращаться
winsock2.h ? #ifndef FD_SETSIZE #define FD_SETSIZE 64 #endif /* FD_SETSIZE */ typedef struct fd_set { u_int fd_count; /* how many are SET? */ SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */ } fd_set; #define FD_SET(fd, set) do { \ u_int __i; \ for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \ if (((fd_set FAR *)(set))->fd_array[__i] == (fd)) { \ break; \ } \ } \ if (__i == ((fd_set FAR *)(set))->fd_count) { \ if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \ ((fd_set FAR *)(set))->fd_array[__i] = (fd); \ ((fd_set FAR *)(set))->fd_count++; \ } \ } \ } while(0)
описание как с этим общаться надо искать у Стивенса. Хотя я стивенса не читал, и обычно консультируюсь с info libc (есть и online версия мануала glibc). Если тебе действительно виндовая версия нужна, помочь ничем не могу, в *nix, это надо искать в ... man select вот что говорит: /* According to POSIX 1003.1-2001 */ #include <sys/select.h> /* According to earlier standards */ #include <sys/time.h> #include <sys/types.h> #include <unistd.h>
нужно именно виндовая.. если я правильно поняла они могут отличаться от никсовых.. Спасиба большое пойду тестить
FDZERO MACRO fds mov fds.fd_count, 0 ENDM FDSET MACRO hSocket, fds mov eax, hSocket mov ecx, fds.fd_count shl ecx, 2 mov fds.fd_array[ecx], eax inc fds.fd_count ENDM
FD_SET макрос для СиПлюсПлюс. Вот его код: #define FD_SET(fd, set) do { \ if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) \ ((fd_set FAR *)(set))->fd_array[((fd_set FAR *)(set))->fd_count++]=(fd);\ } while(0) Взято из "WINSOCK.H" из Visual C++ 6. В других include-файлах может быть другое определение этого макроса. Например, из Platform SDK SP2: #define FD_SET(fd, set) do { \ u_int __i; \ for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \ if (((fd_set FAR *)(set))->fd_array[__i] == (fd)) { \ break; \ } \ } \ if (__i == ((fd_set FAR *)(set))->fd_count) { \ if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \ ((fd_set FAR *)(set))->fd_array[__i] = (fd); \ ((fd_set FAR *)(set))->fd_count++; \ } \ } \ } while(0) Но делаеют они одно и тоже. Во втором случае проверяется нет ли сокета s уже в наборе. Да и я не знаю зачем сделали так: do { statements; } while(0) Похоже программисты у mIcRo$ofT тоже ленивые как и мы Хотя скорее всего это сделанно умышленно, потому что в блоке создаются свои локальные(или как там их называют)переменные. Макрос FD_SET нужен для добавления сокета s в набор set. А наборы используются в функции select(...). В набор добавляется сокет, который нужно проверить, например можно ли в него писать. Тогда с помощью FD_SET добавляем сокет в набор и указаываем параметром select указатель на набор. Если после вызова функции сокет до сих пор входит в набор, то писать в него можно. Остальные макросы: FD_CLR - удаляет сокет их набора: #define FD_CLR(fd, set) do { \ u_int __i; \ for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { \ if (((fd_set FAR *)(set))->fd_array[__i] == fd) { \ while (__i < ((fd_set FAR *)(set))->fd_count-1) { \ ((fd_set FAR *)(set))->fd_array[__i] = \ ((fd_set FAR *)(set))->fd_array[__i+1]; \ __i++; \ } \ ((fd_set FAR *)(set))->fd_count--; \ break; \ } \ } \ } while(0) FD_ISSET - проверяет, входит ли в набор сокет: #define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set FAR *)(set)) FD_ZERO - делает пустой набор: #define FD_ZERO(set) (((fd_set FAR *)(set))->fd_count=0) Почитать можно код. Потому что вот всё что сказано в MSDN про эти макросы : "Since sockets are not represented by the UNIX-style, small, non-negative integer, the implementation of the select function was changed in Windows Sockets. Each set of sockets is still represented by the FD_SET structure, but instead of being stored as a bitmask, the set is implemented as an array of sockets. To avoid potential problems, applications must adhere to the use of the FD_XXX macros to set, initialize, clear, and check the FD_SET structures. "