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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Иногда выдает WSAEINVAL 
:(
    Опции темы
Enelar
Дата 23.1.2011, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Для своих нужд, удобства, набора опыта и много чего другого пишу сетевой интерфейс. Между платформенным уровнем и моим.
Работа с неблокирующими сокетами.
WSAGetLastError выдает одно из трех. WSAEISCONN, WSAEWOULDBLOCK, WSAEINVAL(Соединяюсь на заведомо открытый порт)
Собственно читаем документацию
Код

The parameter s is a listening socket, - исключаем, значение точно остается то же, и не используется нигде больше
or the destination address specified is not consistent with that of the constrained group to which the socket belongs, 
or the lpGQOS parameter is not NULL. - не использую WSAConnect, так что тоже не верно

Остается второе. Что это означает, как менять группу, и почему выдает через раз(два три).

И второй маленький вопрос по коду.
Код

LOW_STATUSES low::Connect( uint &s, dword addr, const int 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)
      return TRYING_CONNECT;
    if (res == WSAEINVAL)
      throw FATAL_LIBRARY_EXEPTION;
    return CONNECTION_REFUSED;
  }
  Sleep(1);
  return SUCCESS;
}

Не хочется обрабатывать все n состояний WSA, плюс на верхнем уровне у меня все равно должно обрабатываться 4 состояния - удача, ждем, не удача, ошибка.
Коннект состоит в переодическом вызывании этой функции. CreateSocket перезаписывает s только один раз.

Если вопрос задан коряво, готов принять критику.

PS Дополнение. При последующем вызове connect, возвращается WSAISCONN. Получается инвалидный аргумент просто игнорировать??? А вдруг он вылетит по делу???

Это сообщение отредактировал(а) Enelar - 23.1.2011, 20:36
PM MAIL   Вверх
Олег2005
Дата 26.1.2011, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как я понимаю - это у вас клиент - раз идет коннект.
Не вижу как формируется адрес
address.sin_addr.S_un.S_addr = addr;
Насчет групп - они тут не причем, у вас нет QOS.

и еще
Следует также иметь в виду следующее важное обстоятельство. Если соединение по данному сокету не удалось, то сокет (для некоторых типов ошибок) оказывается в неспецифицированном состоянии, и следует обязательно закрыть только-что неудачно использованный сокет, и перед новым вызовом connect(), например в цикле, вновь должен быть произведен вызов socket(). Приложения, соответствующие стандарту POSIX-2001, должны закрыть дескриптор sd и создать новый сокет для продолжения попыток установить соединение. Однако, если попытка соединения не удалась по причинам WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT, то приложение может повторить вызов connect() для этого же сокета.

WSAEINVAL
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.
В общем так сразу и не скажешь smile 
PM MAIL WWW MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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