Я человек простой, использую 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;
}