Ошибка функции подключения С++ - неверный аргумент

Я пытаюсь создать простой клиент сокета (используя компилятор Debian 6 и g++), и когда я вызываю функцию «подключиться», он возвращает код ошибки 22 — неверный аргумент. Подскажите, что я делаю не так, пожалуйста.

Я прочитал справочную страницу этой функции, и там сказано, что 3 аргумента должны быть следующими: int, struct sockaddr* и socklen_t.

Мой код:

  int                   serverPort;
  u_long                serverHost;
  struct sockaddr_in    serverAddress;
  socklen_t             serverAddressLength;
  int                   clientSocket;

  serverPort = 44444;
  serverHost = inet_addr ( "88.198.237.65" );
  serverAddress.sin_family = AF_INET;
  serverAddress.sin_port =  htons ( serverPort );
  serverAddress.sin_addr.s_addr = htons ( serverHost );
  serverAddressLength = sizeof ( serverAddress );

  clientSocket = socket ( AF_INET , SOCK_STREAM , 0 );

  connect ( clientSocket , (sockaddr*)&serverAddress , serverAddressLength )

person Kolyunya    schedule 03.08.2012    source источник


Ответы (1)


  serverAddress.sin_addr.s_addr = htons ( serverHost );

Адрес IPv4 длинный, а не короткий, поэтому htons подходит. Данные в любом случае уже находятся в сетевом порядке байтов, поэтому преобразование не требуется.

Функция inet_addr() преобразует адрес интернет-узла cp из записи чисел и точек IPv4 в двоичные данные в сетевом порядке байтов.

Также:

 char                  serverHost;

Как он должен поместиться в char?

person David Schwartz    schedule 03.08.2012
comment
Что касается вашего последнего вопроса - Удача?! - person Ed Heal; 03.08.2012
comment
Большое спасибо, Давид! Могу я спросить вас, почему, если я не применяю htons к serverHost на стороне сервера, функция привязки возвращает Cannot assign запрашиваемый адрес и возвращает успешно привязанный Socket, если я DO использую htons? Еще раз большое спасибо! - person Kolyunya; 03.08.2012
comment
@Kolynya: Не пытайтесь понять известный глючный код. Это просто сведет вас с ума. (Возможно, по счастливой случайности htons превратил его в ноль, что, вероятно, вы действительно хотели.) Вероятно, причина, по которой вы получили Невозможно назначить адрес запроса, заключается в том, что вы пытались bind по адресу, который не был назначен локальной системе. . - person David Schwartz; 03.08.2012
comment
Спасибо за ваш ответ, Дэвид. На самом деле я привязываю сокет к локальному IP-адресу. В любом случае, как я вижу, htons по какой-то причине IS требуется в функции привязки, верно? - person Kolyunya; 03.08.2012
comment
Нет, это просто изменение одной ошибки на другую ошибку. (htons подходит для порта, но никогда не подходит для IPv4-адреса.) Исправьте ошибки, которые я упомянул, и опубликуйте код, который все еще вызывает у вас проблемы. (Если это Linux-компьютер, запуск strace на нем также полезен.) - person David Schwartz; 03.08.2012
comment
Итак, как мне ПРАВИЛЬНО связать свой сокет с адресом? Я читал, что могу использовать константу INADDR_ANY(?), которая возвращает локальный IP-адрес. И это ДЕЙСТВИТЕЛЬНО сработало для меня - person Kolyunya; 03.08.2012
comment
Исходный вопрос был решен путем удаления htons и замены char на u_long. - person Kolyunya; 03.08.2012
comment
Привязка к INADDR_ANY заставляет сервер принимать соединения с любым локальным IP-адресом. (включая 127.0.0.1) - person David Schwartz; 03.08.2012