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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокировка сокета, траблы с блокировкой 
:(
    Опции темы
Gram02
Дата 1.8.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 28.6.2006

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



есть такой поток
Код

DWORD WINAPI BotManagedComand(LPVOID Param)
{
      SOCKET s = (SOCKET)Param;
      BYTE *buf = new BYTE[4096];
      ULONG ul = 0;
      int result;
      result = ioctlsocket(s,FIONBIO ,&ul);
      do
      {
      result=recv(s,buf,4096,NULL );
        if (  result == SOCKET_ERROR )
      {

        delete[] buf;
        return 0;
      }
      TNetMessage msg(buf,4096);
//      msg = (TNetMessage)buf;

        switch(msg.GetID())
        {
        case ctLeaveGame:  break;
        case ctJoinInGame: break;
        case ctDestoy:    break;
        case ctAddBotsToTable: break;
        case ctRequestPage:
                int PageNo;
                msg.GetField(&PageNo);
                frmMain->BMRequestPageRe(s,PageNo);
                break;
        default : MessageBox(0,"Error Bot's managed Unknow state!!!!","",MB_OK);

        }
      }while(1);
}

так вот проблема в том что он после приема 1 пакета сокет не блокируется(recv должен как я понимаю остановить поток и ждать следующий пакет) и поток спамит клиента в результате чего последний его посылает и конект закрывается  

создание сокета 
    s = socket(AF_INET,SOCK_STREAM,0);
    bind(s,(sockaddr*)&addr,sizeof(addr));
    listen(s,SOMAXCONN);
    sc =  accept(s,0,0);

 smile  smile  smile  smile 
 smile 
PM MAIL   Вверх
Artemon
Дата 1.8.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Вообще-то ты его сам делаешь асинхронным.

ULONG ul = 0;
int result;
result = ioctlsocket(s,FIONBIO ,&ul);

Если хочешь чтобы сокет был блокирующим, то выкини этот код из своей программы, ведь при создании сокета - он по умолчанию блокирующий.





--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Artemon
Дата 2.8.2006, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Ошибся, если бы ul = 1, тогда бы он был асинхронным.

Может быть несколько причин, по которым сокет становится неблокирующим:

1) Вызов ф-ии WsaAsyncSelect (и подобных)
2) Вызов ioctlsocket с параметром 1


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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