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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неблокирующиеся сокеты vista 
:(
    Опции темы
Enelar
Дата 13.1.2012, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проблема. Судя по возвращаемому значению прога передает все байты. Но как факт сниффер ловит передачу только если на локал хосте. Мистика.
Что заставляет работать неправильно?

Код

namespace
{
#ifndef _CODEBLOCKS_
  class WSA
  {
  public:
    int Success;
    WSA( void )
    {
      WSADATA Data;

      if (WSAStartup(MAKEWORD(1, 0), &Data) != 0)
        Success = 0;
      else
        Success = 1;
    }
    ~WSA( void )
    {
      WSACleanup();
    }
  };
  WSA Dermo;
#endif
  void CloseSocket( dword &s )
  {
    shutdown(s, SD_BOTH);
    closesocket(s);
  }

  bool CreateSocket( dword &s )
  {
    if (s != INVALID_SOCKET)
      return true;
    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET)
      return false;
    unsigned long a = 1;
    if (ioctlsocket(s, FIONBIO, &a) == SOCKET_ERROR)
    {
      CloseSocket(s);
      return false;
    }
    return true;
  }
}

LOW_STATUSES low::Connect( dword &s, dword addr, const word port )
{
  if (!CreateSocket(s))
    return CANT_CREATE_SOCKET;
  struct sockaddr_in address;
  address.sin_family = AF_INET;
  address.sin_port = htons(port);
  address.sin_addr.S_un.S_addr = addr;
  memset(address.sin_zero, 0, 8);
  if (connect(s, (sockaddr *)&address, sizeof(address)) == SOCKET_ERROR)
  {
    int res = WSAGetLastError();
    if (res == WSAEISCONN)
      return SUCCESS;
    if (res == WSAEWOULDBLOCK || res == WSAEINVAL)
      return TRYING_CONNECT;
    return LOW_CONNECTION_REFUSED;
  }
  return SUCCESS;
}

LOW_STATUSES low::Send( const unsafe_dword s, const unsafe_byte *buff, const word size )
{
  if (s == _TL4_NOT_SOCKET_ || buff == NULL)
    throw_exception("Low level protect");
  int a;
  if ((a = send(s, (char *)buff, size, 0)) == -1)
  {
    a = WSAGetLastError();
    if (a == WSAEWOULDBLOCK)
      return PLEASE_WAIT;
    return DISCONNECT;
  }
  throw_assert(a == size);
  return SUCCESS;
}

Вот, менял на
WsaSend, добавлял везде где можно Sleep(1)...
Но по прежнему функция recv возвращает -1, а WSAGetLastError = WOULD_BLOCK

И сниффер, при работе с нелокальными серверами молчит... Антивирус выключен, проверял и под 2008 и под 2010, на семерке и висте, разных машинах. Под свиньей все без сбоев. Что то изменилось при переходе на новую версию?
PM MAIL   Вверх
boostcoder
Дата 13.1.2012, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(Enelar @  13.1.2012,  05:38 Найти цитируемый пост)
WSA Dermo;

откровенно, однако..

Цитата(Enelar @  13.1.2012,  05:38 Найти цитируемый пост)
 функция recv возвращает -1, а WSAGetLastError = WOULD_BLOCK

так и должно быть, если данные за один вызов не отправлены. повторяй позже.

из офф доки:
Цитата

Resource temporarily unavailable.
This error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a nonfatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a nonblocking SOCK_STREAM socket, since some time must elapse for the connection to be established.

PM WWW   Вверх
feodorv
Дата 13.1.2012, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Enelar @  13.1.2012,  05:38 Найти цитируемый пост)
address.sin_addr.S_un.S_addr = addr;

Я, право, не знаю, как у Вас формируется addr, но если он не в сетевом порядке байт, то должно быть 
Код

address.sin_addr.S_un.S_addr = htonl( addr );

Хотя, если соннект проходит...

Цитата(Enelar @  13.1.2012,  05:38 Найти цитируемый пост)
Но по прежнему функция recv возвращает -1

recv или send? Если recv, то просто от другого конца ничего не приходит...


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


 




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


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

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