The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Hеблокирующие сокеты (socket blocking example)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: socket, blocking, example,  (найти похожие документы)
Date: Thu, 22 Feb 2001 14:20:29 +0300 From: "Andrew E. 'Onyx' Shevtsov" <Andrew.E.\'Onyx\'[email protected]> 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 ===

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру