Ключевые слова:socket, blocking, example, (найти похожие документы)
Date: Thu, 22 Feb 2001 14:20:29 +0300
From: "Andrew E. 'Onyx' Shevtsov" <Andrew.E.\'Onyx\'.Shevtsov@p10.f859.n5020.z2.fidonet.org>
Newsgroups: fido7.ru.unix.prog
Subject: Hеблокирующие сокеты
GZ> Hаписал сервер, который работает с блокирующими сокетами.
GZ> Возникла потребность переделать его на работу с
GZ> неблокирующими.
GZ> Очень прижало со временем ;( Есть всего день-два.
бывает
GZ> Поэтому, если у кого есть готовые функции
GZ> чтения/записи через неблок. сокеты или url, где
ну запись то такая же как с блоковыми
GZ> их можно взять, буду очень благодарен.
ну вот то что я использую в таких случаях, конечно пpоблема вpемя жpет, но я
еще с SIGIO не pазобpался(не понимаю как заставить сокет SIGIO посылать).
clients - массив дескpиптоpов существующих соединений
sockid - дескpиптоp основного сокета
возвpащает количество дескpиптоpов готовых к чтению + 1 если кто то пpиацепчен
остальное в msids
=== Cut ===
struct msgnnsock {
int acptid; // дескpиптоp пpиацепченого пользователя
struct sockaddr_in user; // его ip
int sockids[MAXUSERS]; // массив дескpиптоpов готовых к чтению
};
int recv_msgnnsock(int sockid, int clients[MAXUSERS], struct msgnnsock *msids)
{
int sckn, acpt, num = 0, i;
char buf[MAXBUFF];
socklen_t addrlen;
struct sockaddr_in user;
addrlen = sizeof(struct sockaddr_in);
msids[0].acptid = -1;
while(num == 0)
{
// sockets
for(i = 0; i < MAXUSERS; i++)
{
if(clients[i] != 0)
{
bzero(&buf, sizeof(char)*MAXBUFF);
sckn = recv(clients[i], &buf,
sizeof(char)*MAXBUFF, MSG_PEEK);
if(sckn == -1 && errno != EAGAIN) {
perror("recv"); return -1; }
if(sckn == 0) {
msids[0].sockids[0] = clients[i];
return 0;
}
if(sckn > 0)
msids[0].sockids[num++] = clients[i];
}
}
// accept
acpt = accept(sockid, (struct sockaddr *) &user, &addrlen);
if(acpt == -1 && errno != EWOULDBLOCK) {
perror("accept"); return -1; }
if(acpt > 0) {
msids[0].acptid = acpt;
memcpy(&msids[0].user, &user, sizeof(struct sockaddr_in));
num++;
}
}
return num;
}
=== Cut ===