Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FreeBSD, read non_block socket, Совет нужен... 
:(
    Опции темы
Alone
Дата 26.2.2004, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: нет
Всего: 6



Доброго дня. В работе с сокетами использую неблокирующие сокеты.

Подскажите пример для чтения данных, с использованием kevent()
Или подскажите, что необходимо учитывать или на что обращать внимание...

Вот мой код:

int Console::ReadMsg( PString & str ){
cout << "Console::ReadMsg( PString & str )" << endl;

int retn=-1;
int poller = kqueue();
Buffer[0]='\0';

PAssertOS( poller>0 );

struct kevent event;
struct kevent result;
struct timespec ts = { 0, 0 };
int what = 0;
int step=0;

memset( &event, 0, sizeof(event) );
event.ident = sock;
event.filter = EVFILT_READ;
event.flags = EV_ADD | EV_ENABLE;

what = kevent( poller, &event, 1, NULL, 0, &ts );

ts.tv_sec = 3; // таймаут на 3 сек.

while( true ){
cout << "while(true) step: "<< step << endl;

while (1){
what = kevent( poller, NULL, 0, &result, 1, &ts );
cout << "what=" << what << " errno=" << errno << endl;

if ( what<0 ){
if ( errno==EINTR || errno==EAGAIN) continue;
PAssertAlways( strerror( errno ) );
}
break;
}
// до сих пор вроде как ясно...

// итак, получили событие.
if ( what == 1 ){

PAssertOS( (int) result.ident == sock );
cout << "Read... " << endl;
// прочитали сокет
retn = recv(sock, Buffer, 2048, 0);

cout << "retn=" << retn << endl;

if ( retn < 0 ){
// вот тут начинаются вопросы:
// если получаем retn=-1 и EAGAIN or EINTR, то что делать дальше? попытаться читать сокет еще раз, или продолжать ловить событие от kevent(), потом читать... короче по кругу.

if ( errno != EAGAIN || errno != EINTR){
retn = -1;
break;
}else{
// таки не прочитали сокет...
retn = str.GetLength();
break;
}
}else if ( retn > 0 ){
// успешно прочитали сокет
Buffer[retn]='\0';
str += (PString)Buffer;
}
//break;

}else if ( what == 0 ){
// нарвались на таймаут...
retn =- 1;
break;
}
step+=1;
}
PAssertOS( close( poller ) == 0 );

cout << retn <<"-------------------------------------------------\n\r"
<< Buffer
<< "\n\r-------------------------------------------------\n\r"
<< endl;

return retn;
}



--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0403 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.