ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
4 декабря
1426758 Топик полностью
Samx (15.04.2024 19:50, просмотров: 64) ответил Dingo на И всё же пока непонятно, как это скрестить с poll() . Достаточно ли дескриптор сокета поместить в список ожидания? Какого события ждать - доступности на чтение? Beej пишет, что listen() нужен, но как понимаю в контексте "один сервер - много клиентов". SOCK_STREAM - тогда в потоки с listen(), а для работы без listen() какой дефайн использовать? Конечно, попробую, протестирую, но если знаете ответ - буду рад подсказкам.
Я человек простой, использую select() с таймаутом: 

int Slocd_Receive(struct TSockLocal *me,unsigned char *data,int maxlen, int timeout, int *len)

{

// timeout - в миллисекундах

fd_set readfd;

struct timeval tv;

int rc;

int fdmax1;

socklen_t fromlen;

*len=0;

if(me->St<0)

{

me->Error|=128;

return 128;

}

if(me->Error) return me->Error;

FD_ZERO(&readfd);

FD_SET(me->St, &readfd);

fdmax1=me->St+1;

tv.tv_sec=timeout/1000;

tv.tv_usec=(timeout%1000)*1000;

rc=select(fdmax1,&readfd,NULL,NULL,&tv);

if(rc==SOCKET_ERROR)

{

if(errno==EINTR) return 0; // операция прервана сигналом, считаем за тайм-аут

closesocket(me->St);

me->St=INVALID_SOCKET;

me->Error|=256;

return 256;

}

if(!rc) return 0; // тайм-аут

if(!FD_ISSET(me->St,&readfd)) return 0; // не тот сокет, посчитаем за тайм-аут

struct sockaddr_un fr_un;

fromlen= sizeof(struct sockaddr_un);

rc=recvfrom(me->St,data,maxlen,0, (struct sockaddr*)&fr_un,&fromlen);

if(rc==SOCKET_ERROR)

{

closesocket(me->St);

me->St=INVALID_SOCKET;

me->Error|=512;

return 512;

}

*len=rc;

memset(&(me->RecvFromAddr),0,sizeof(me->RecvFromAddr));

memcpy(&(me->RecvFromAddr),&fr_un,fromlen);

me->RecvFromLen=fromlen;

return 0;

}