The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Проблема с вызовом bind()  и recvfrom()"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Проблема с вызовом bind()  и recvfrom()"
Сообщение от NSH emailИскать по авторуВ закладки on 17-Дек-02, 16:29  (MSK)
Добрый день! Помогите решить следующую проблему. Пишу udp-сервер под Windows. Bind() работает только тогда, когда адрес по которому необходимо выполнить соединение равен константе INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать. Кстати, в ТСP-сервере та же проблема. И может ли UDP вообще работать при равенстве адреса этой константе (INADDR_ANY)?
И еще вопрос: объясните, пожалуйсто, что из себя представляют пятый и шестой параметры функций recvfrom() и sendto().
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от ilya emailИскать по авторуВ закладки on 18-Дек-02, 09:48  (MSK)
>Добрый день! Помогите решить следующую проблему. Пишу udp-сервер под Windows. Bind() работает
>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать. Кстати,
>в ТСP-сервере та же проблема. И может ли UDP вообще работать
>при равенстве адреса этой константе (INADDR_ANY)?
>И еще вопрос: объясните, пожалуйсто, что из себя представляют пятый и шестой
>параметры функций recvfrom() и sendto().

покажите вызов bind с конкретным IP

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от NSH emailИскать по авторуВ закладки on 18-Дек-02, 11:03  (MSK)
>>Добрый день! Помогите решить следующую проблему. Пишу udp-сервер под Windows. Bind() работает
>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать. Кстати,
>>в ТСP-сервере та же проблема. И может ли UDP вообще работать
>>при равенстве адреса этой константе (INADDR_ANY)?
>>И еще вопрос: объясните, пожалуйсто, что из себя представляют пятый и шестой
>>параметры функций recvfrom() и sendto().
>
>покажите вызов bind с конкретным IP

Для TCP сервера:

char *hname;
char *sname;

struct sockaddr_in local;
SOCKET s;

  hname = "192.168.228.44";
  sname = "9000";

  local->sin_family=AF_INET;
  rc = inet_addr(hname);
  local->s_addr = rc;
  port = strtol(sname, &endptr, 0);
  local->sin_port = htons(port);

s=socket(AF_INET, SOCK_STREAM, 0);
if (!isvalidsock(s))
     error(1,errno,"Mistake of a call of socket");

if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)))
     error(1,errno,"ошибка вызова setsockopt");

if (bind(s, (struct sockaddr*)&local, sizeof(local)))
     error(1,errno,"Mistake of a call of bind");

Если hname = "127.0.0.1" или мой собственный IP, то все ок!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от Bizon Искать по авторуВ закладки on 18-Дек-02, 12:23  (MSK)
>>>Добрый день! Помогите решить следующую проблему. Пишу udp-сервер под Windows. Bind() работает
>>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать. Кстати,
>>>в ТСP-сервере та же проблема. И может ли UDP вообще работать
>>>при равенстве адреса этой константе (INADDR_ANY)?
>>>И еще вопрос: объясните, пожалуйсто, что из себя представляют пятый и шестой
>>>параметры функций recvfrom() и sendto().
>>
>>покажите вызов bind с конкретным IP
>
>Для TCP сервера:
>
> char *hname;
> char *sname;
>
> struct sockaddr_in local;
> SOCKET s;
>
>  hname = "192.168.228.44";
>  sname = "9000";
>
>  local->sin_family=AF_INET;
>  rc = inet_addr(hname);
>  local->s_addr = rc;
>  port = strtol(sname, &endptr, 0);
>  local->sin_port = htons(port);
>
> s=socket(AF_INET, SOCK_STREAM, 0);
> if (!isvalidsock(s))
>     error(1,errno,"Mistake of a call of socket");
>
> if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)))
>     error(1,errno,"ошибка вызова setsockopt");
>
> if (bind(s, (struct sockaddr*)&local, sizeof(local)))
>     error(1,errno,"Mistake of a call of bind");
>
>Если hname = "127.0.0.1" или мой собственный IP, то все ок!


1. Ф-ции recvfrom и sendto используются для не ориентированных на соединения сокеты. То есть напрмер для IP - создаёшь header для пакета
помещаешь его 5-ым параметром длину - 6-ым параметром и делаешь sendto без вызова connect. Правда сокет надо определить(если IP) как RAW.

2. И с чего ты решил что пишешь UDP сервер??? ф-ция  socket для UDP -должна выглядить по другому.

3. По поводу bind - знаешь что значит параметр SO_REUSEADDR в setsockopt??

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от NSH emailИскать по авторуВ закладки on 18-Дек-02, 13:04  (MSK)
>>>>Добрый день! Помогите решить следующую проблему. Пишу udp-сервер под Windows. Bind() работает
>>>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать. Кстати,
>>>>в ТСP-сервере та же проблема. И может ли UDP вообще работать
>>>>при равенстве адреса этой константе (INADDR_ANY)?
>>>>И еще вопрос: объясните, пожалуйсто, что из себя представляют пятый и шестой
>>>>параметры функций recvfrom() и sendto().
>>>
>>>покажите вызов bind с конкретным IP
>>
>>Для TCP сервера:
>>
>> char *hname;
>> char *sname;
>>
>> struct sockaddr_in local;
>> SOCKET s;
>>
>>  hname = "192.168.228.44";
>>  sname = "9000";
>>
>>  local->sin_family=AF_INET;
>>  rc = inet_addr(hname);
>>  local->s_addr = rc;
>>  port = strtol(sname, &endptr, 0);
>>  local->sin_port = htons(port);
>>
>> s=socket(AF_INET, SOCK_STREAM, 0);
>> if (!isvalidsock(s))
>>     error(1,errno,"Mistake of a call of socket");
>>
>> if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)))
>>     error(1,errno,"ошибка вызова setsockopt");
>>
>> if (bind(s, (struct sockaddr*)&local, sizeof(local)))
>>     error(1,errno,"Mistake of a call of bind");
>>
>>Если hname = "127.0.0.1" или мой собственный IP, то все ок!
>
>
>1. Ф-ции recvfrom и sendto используются для не ориентированных на соединения сокеты.
>То есть напрмер для IP - создаёшь header для пакета
>помещаешь его 5-ым параметром длину - 6-ым параметром и делаешь sendto без
>вызова connect. Правда сокет надо определить(если IP) как RAW.
>
>2. И с чего ты решил что пишешь UDP сервер??? ф-ция  
>socket для UDP -должна выглядить по другому.
>
>3. По поводу bind - знаешь что значит параметр SO_REUSEADDR в setsockopt??
>

0.Объясните фразу создаёшь "header для пакета"
1.этот кусок программы написан для TCP сервера. Проблема с bind одинаковая и для TCP сервера и для UDP сервера:
Bind() работает
только тогда, когда адрес по которому необходимо выполнить соединение равен константе
INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать.
2.То, что функция socket для UDP выглядит по-другому - это я знаю.
3.По поводу SO_REUSEADDR: эта опция используется для немедленного перезапуска сервера не дожидаясь выхода предыдущего соединения из состояния TIME-WAIT. Разве это имеет отношение к моей проблеме????

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от Bizon Искать по авторуВ закладки on 18-Дек-02, 13:24  (MSK)
>>>>>Добрый день! Помогите решить следующую проблему. Пишу udp-сервер под Windows. Bind() работает
>>>>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>>>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать. Кстати,
>>>>>в ТСP-сервере та же проблема. И может ли UDP вообще работать
>>>>>при равенстве адреса этой константе (INADDR_ANY)?
>>>>>И еще вопрос: объясните, пожалуйсто, что из себя представляют пятый и шестой
>>>>>параметры функций recvfrom() и sendto().
>>>>
>>>>покажите вызов bind с конкретным IP
>>>
>>>Для TCP сервера:
>>>
>>> char *hname;
>>> char *sname;
>>>
>>> struct sockaddr_in local;
>>> SOCKET s;
>>>
>>>  hname = "192.168.228.44";
>>>  sname = "9000";
>>>
>>>  local->sin_family=AF_INET;
>>>  rc = inet_addr(hname);
>>>  local->s_addr = rc;
>>>  port = strtol(sname, &endptr, 0);
>>>  local->sin_port = htons(port);
>>>
>>> s=socket(AF_INET, SOCK_STREAM, 0);
>>> if (!isvalidsock(s))
>>>     error(1,errno,"Mistake of a call of socket");
>>>
>>> if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)))
>>>     error(1,errno,"ошибка вызова setsockopt");
>>>
>>> if (bind(s, (struct sockaddr*)&local, sizeof(local)))
>>>     error(1,errno,"Mistake of a call of bind");
>>>
>>>Если hname = "127.0.0.1" или мой собственный IP, то все ок!
>>
>>
>>1. Ф-ции recvfrom и sendto используются для не ориентированных на соединения сокеты.
>>То есть напрмер для IP - создаёшь header для пакета
>>помещаешь его 5-ым параметром длину - 6-ым параметром и делаешь sendto без
>>вызова connect. Правда сокет надо определить(если IP) как RAW.
>>
>>2. И с чего ты решил что пишешь UDP сервер??? ф-ция  
>>socket для UDP -должна выглядить по другому.
>>
>>3. По поводу bind - знаешь что значит параметр SO_REUSEADDR в setsockopt??
>>
>
>0.Объясните фразу создаёшь "header для пакета"
>1.этот кусок программы написан для TCP сервера. Проблема с bind одинаковая и
>для TCP сервера и для UDP сервера:
>Bind() работает
>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать.
>2.То, что функция socket для UDP выглядит по-другому - это я знаю.
>


header для пакета?
ну для любого пакета (ip,tcp, и т.д.) - есть заголовок и данные!
вот именно про этот заголовок и идёт речь!

>3.По поводу SO_REUSEADDR: эта опция используется для немедленного перезапуска сервера не дожидаясь
>выхода предыдущего соединения из состояния TIME-WAIT. Разве это имеет отношение к
>моей проблеме????

Ухты!!! Это что-то новенькое!!!
SO_REUSEADDR indicates that the rules used in validating addresses supplied in a bind(2) call should allow reuse of local addresses.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от NSH emailИскать по авторуВ закладки on 18-Дек-02, 14:45  (MSK)
>>>>>>Добрый день! Помогите решить следующую проблему. Пишу udp-сервер под Windows. Bind() работает
>>>>>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>>>>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать. Кстати,
>>>>>>в ТСP-сервере та же проблема. И может ли UDP вообще работать
>>>>>>при равенстве адреса этой константе (INADDR_ANY)?
>>>>>>И еще вопрос: объясните, пожалуйсто, что из себя представляют пятый и шестой
>>>>>>параметры функций recvfrom() и sendto().
>>>>>
>>>>>покажите вызов bind с конкретным IP
>>>>
>>>>Для TCP сервера:
>>>>
>>>> char *hname;
>>>> char *sname;
>>>>
>>>> struct sockaddr_in local;
>>>> SOCKET s;
>>>>
>>>>  hname = "192.168.228.44";
>>>>  sname = "9000";
>>>>
>>>>  local->sin_family=AF_INET;
>>>>  rc = inet_addr(hname);
>>>>  local->s_addr = rc;
>>>>  port = strtol(sname, &endptr, 0);
>>>>  local->sin_port = htons(port);
>>>>
>>>> s=socket(AF_INET, SOCK_STREAM, 0);
>>>> if (!isvalidsock(s))
>>>>     error(1,errno,"Mistake of a call of socket");
>>>>
>>>> if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)))
>>>>     error(1,errno,"ошибка вызова setsockopt");
>>>>
>>>> if (bind(s, (struct sockaddr*)&local, sizeof(local)))
>>>>     error(1,errno,"Mistake of a call of bind");
>>>>
>>>>Если hname = "127.0.0.1" или мой собственный IP, то все ок!
>>>
>>>
>>>1. Ф-ции recvfrom и sendto используются для не ориентированных на соединения сокеты.
>>>То есть напрмер для IP - создаёшь header для пакета
>>>помещаешь его 5-ым параметром длину - 6-ым параметром и делаешь sendto без
>>>вызова connect. Правда сокет надо определить(если IP) как RAW.
>>>
>>>2. И с чего ты решил что пишешь UDP сервер??? ф-ция  
>>>socket для UDP -должна выглядить по другому.
>>>
>>>3. По поводу bind - знаешь что значит параметр SO_REUSEADDR в setsockopt??
>>>
>>
>>0.Объясните фразу создаёшь "header для пакета"
>>1.этот кусок программы написан для TCP сервера. Проблема с bind одинаковая и
>>для TCP сервера и для UDP сервера:
>>Bind() работает
>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать.
>>2.То, что функция socket для UDP выглядит по-другому - это я знаю.
>>
>
>
>
>
>header для пакета?
>ну для любого пакета (ip,tcp, и т.д.) - есть заголовок и данные!
>
>вот именно про этот заголовок и идёт речь!
>
>>3.По поводу SO_REUSEADDR: эта опция используется для немедленного перезапуска сервера не дожидаясь
>>выхода предыдущего соединения из состояния TIME-WAIT. Разве это имеет отношение к
>>моей проблеме????
>
>Ухты!!! Это что-то новенькое!!!
>SO_REUSEADDR indicates that the rules used in validating addresses supplied in a
>bind(2) call should allow reuse of local addresses.

По-моему это тоже самое.
Ты предлагаешь мне не устанавливать эту опцию.
Так для UDP сервера я функцию setsockopt вообще не вызываю, никаких опций не устанавливаю. А проблема остается.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от Bizon Искать по авторуВ закладки on 18-Дек-02, 16:18  (MSK)
>>>>>>>Добрый день! Помогите решить следующую проблему. Пишу udp-сервер под Windows. Bind() работает
>>>>>>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>>>>>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать. Кстати,
>>>>>>>в ТСP-сервере та же проблема. И может ли UDP вообще работать
>>>>>>>при равенстве адреса этой константе (INADDR_ANY)?
>>>>>>>И еще вопрос: объясните, пожалуйсто, что из себя представляют пятый и шестой
>>>>>>>параметры функций recvfrom() и sendto().
>>>>>>
>>>>>>покажите вызов bind с конкретным IP
>>>>>
>>>>>Для TCP сервера:
>>>>>
>>>>> char *hname;
>>>>> char *sname;
>>>>>
>>>>> struct sockaddr_in local;
>>>>> SOCKET s;
>>>>>
>>>>>  hname = "192.168.228.44";
>>>>>  sname = "9000";
>>>>>
>>>>>  local->sin_family=AF_INET;
>>>>>  rc = inet_addr(hname);
>>>>>  local->s_addr = rc;
>>>>>  port = strtol(sname, &endptr, 0);
>>>>>  local->sin_port = htons(port);
>>>>>
>>>>> s=socket(AF_INET, SOCK_STREAM, 0);
>>>>> if (!isvalidsock(s))
>>>>>     error(1,errno,"Mistake of a call of socket");
>>>>>
>>>>> if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)))
>>>>>     error(1,errno,"ошибка вызова setsockopt");
>>>>>
>>>>> if (bind(s, (struct sockaddr*)&local, sizeof(local)))
>>>>>     error(1,errno,"Mistake of a call of bind");
>>>>>
>>>>>Если hname = "127.0.0.1" или мой собственный IP, то все ок!
>>>>
>>>>
>>>>1. Ф-ции recvfrom и sendto используются для не ориентированных на соединения сокеты.
>>>>То есть напрмер для IP - создаёшь header для пакета
>>>>помещаешь его 5-ым параметром длину - 6-ым параметром и делаешь sendto без
>>>>вызова connect. Правда сокет надо определить(если IP) как RAW.
>>>>
>>>>2. И с чего ты решил что пишешь UDP сервер??? ф-ция  
>>>>socket для UDP -должна выглядить по другому.
>>>>
>>>>3. По поводу bind - знаешь что значит параметр SO_REUSEADDR в setsockopt??
>>>>
>>>
>>>0.Объясните фразу создаёшь "header для пакета"
>>>1.этот кусок программы написан для TCP сервера. Проблема с bind одинаковая и
>>>для TCP сервера и для UDP сервера:
>>>Bind() работает
>>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать.
>>>2.То, что функция socket для UDP выглядит по-другому - это я знаю.
>>>
>>
>>
>>
>>
>>header для пакета?
>>ну для любого пакета (ip,tcp, и т.д.) - есть заголовок и данные!
>>
>>вот именно про этот заголовок и идёт речь!
>>
>>>3.По поводу SO_REUSEADDR: эта опция используется для немедленного перезапуска сервера не дожидаясь
>>>выхода предыдущего соединения из состояния TIME-WAIT. Разве это имеет отношение к
>>>моей проблеме????
>>
>>Ухты!!! Это что-то новенькое!!!
>>SO_REUSEADDR indicates that the rules used in validating addresses supplied in a
>>bind(2) call should allow reuse of local addresses.
>
>По-моему это тоже самое.
>Ты предлагаешь мне не устанавливать эту опцию.
>Так для UDP сервера я функцию setsockopt вообще не вызываю, никаких опций
>не устанавливаю. А проблема остается.


блин я в шоке.
попробуй так:
local->s_addr = htonl(inet_addr(hname));

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от NSH emailИскать по авторуВ закладки on 19-Дек-02, 11:14  (MSK)
>>>>>>>>Добрый день! Помогите решить следующую проблему. Пишу udp-сервер под Windows. Bind() работает
>>>>>>>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>>>>>>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать. Кстати,
>>>>>>>>в ТСP-сервере та же проблема. И может ли UDP вообще работать
>>>>>>>>при равенстве адреса этой константе (INADDR_ANY)?
>>>>>>>>И еще вопрос: объясните, пожалуйсто, что из себя представляют пятый и шестой
>>>>>>>>параметры функций recvfrom() и sendto().
>>>>>>>
>>>>>>>покажите вызов bind с конкретным IP
>>>>>>
>>>>>>Для TCP сервера:
>>>>>>
>>>>>> char *hname;
>>>>>> char *sname;
>>>>>>
>>>>>> struct sockaddr_in local;
>>>>>> SOCKET s;
>>>>>>
>>>>>>  hname = "192.168.228.44";
>>>>>>  sname = "9000";
>>>>>>
>>>>>>  local->sin_family=AF_INET;
>>>>>>  rc = inet_addr(hname);
>>>>>>  local->s_addr = rc;
>>>>>>  port = strtol(sname, &endptr, 0);
>>>>>>  local->sin_port = htons(port);
>>>>>>
>>>>>> s=socket(AF_INET, SOCK_STREAM, 0);
>>>>>> if (!isvalidsock(s))
>>>>>>     error(1,errno,"Mistake of a call of socket");
>>>>>>
>>>>>> if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)))
>>>>>>     error(1,errno,"ошибка вызова setsockopt");
>>>>>>
>>>>>> if (bind(s, (struct sockaddr*)&local, sizeof(local)))
>>>>>>     error(1,errno,"Mistake of a call of bind");
>>>>>>
>>>>>>Если hname = "127.0.0.1" или мой собственный IP, то все ок!
>>>>>
>>>>>
>>>>>1. Ф-ции recvfrom и sendto используются для не ориентированных на соединения сокеты.
>>>>>То есть напрмер для IP - создаёшь header для пакета
>>>>>помещаешь его 5-ым параметром длину - 6-ым параметром и делаешь sendto без
>>>>>вызова connect. Правда сокет надо определить(если IP) как RAW.
>>>>>
>>>>>2. И с чего ты решил что пишешь UDP сервер??? ф-ция  
>>>>>socket для UDP -должна выглядить по другому.
>>>>>
>>>>>3. По поводу bind - знаешь что значит параметр SO_REUSEADDR в setsockopt??
>>>>>
>>>>
>>>>0.Объясните фразу создаёшь "header для пакета"
>>>>1.этот кусок программы написан для TCP сервера. Проблема с bind одинаковая и
>>>>для TCP сервера и для UDP сервера:
>>>>Bind() работает
>>>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать.
>>>>2.То, что функция socket для UDP выглядит по-другому - это я знаю.
>>>>
>>>
>>>
>>>
>>>
>>>header для пакета?
>>>ну для любого пакета (ip,tcp, и т.д.) - есть заголовок и данные!
>>>
>>>вот именно про этот заголовок и идёт речь!
>>>
>>>>3.По поводу SO_REUSEADDR: эта опция используется для немедленного перезапуска сервера не дожидаясь
>>>>выхода предыдущего соединения из состояния TIME-WAIT. Разве это имеет отношение к
>>>>моей проблеме????
>>>
>>>Ухты!!! Это что-то новенькое!!!
>>>SO_REUSEADDR indicates that the rules used in validating addresses supplied in a
>>>bind(2) call should allow reuse of local addresses.
>>
>>По-моему это тоже самое.
>>Ты предлагаешь мне не устанавливать эту опцию.
>>Так для UDP сервера я функцию setsockopt вообще не вызываю, никаких опций
>>не устанавливаю. А проблема остается.
>
>
>блин я в шоке.
>попробуй так:
>local->s_addr = htonl(inet_addr(hname));


Прикинь, не помогло.
Самая фишка еще в том, что, если адрес - возвратный или мой собственный IP, то все работает замечательно!
А с этой штукой local->s_addr = htonl(inet_addr(hname)) - не работае никак.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от qq Искать по авторуВ закладки on 19-Дек-02, 16:13  (MSK)
>>>Добрый день! Помогите решить следующую проблему. Пишу udp-сервер под Windows. Bind() работает
>>>только тогда, когда адрес по которому необходимо выполнить соединение равен константе
>>>INADDR_ANY. Как только адресу присваиваю конкретный IP, bind() перестает работать. Кстати,
>>>в ТСP-сервере та же проблема. И может ли UDP вообще работать
>>>при равенстве адреса этой константе (INADDR_ANY)?
>>>И еще вопрос: объясните, пожалуйсто, что из себя представляют пятый и шестой
>>>параметры функций recvfrom() и sendto().
>>
>>покажите вызов bind с конкретным IP
>
>Для TCP сервера:
>
> char *hname;
> char *sname;
>
> struct sockaddr_in local;
> SOCKET s;
>
>  hname = "192.168.228.44";
>  sname = "9000";
>
>  local->sin_family=AF_INET;
>  rc = inet_addr(hname);
>  local->s_addr = rc;
>  port = strtol(sname, &endptr, 0);
>  local->sin_port = htons(port);
>
> s=socket(AF_INET, SOCK_STREAM, 0);
> if (!isvalidsock(s))
>     error(1,errno,"Mistake of a call of socket");
>
> if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)))
>     error(1,errno,"ошибка вызова setsockopt");
>
> if (bind(s, (struct sockaddr*)&local, sizeof(local)))
>     error(1,errno,"Mistake of a call of bind");
>
>Если hname = "127.0.0.1" или мой собственный IP, то все ок!

а попробуй вместо errno использовать значение, возвращаемое WSAGetLastError()
и поглядеть что же это за ошибка в файле winsock2.h
там они определяются так:
#define WSABASEERR              10000
#define WSAEINTR                (WSABASEERR+4)
то есть если тебе вышла ошибка 10022, то ищи
#define WSAEINVAL               (WSABASEERR+22)


  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от qq Искать по авторуВ закладки on 19-Дек-02, 16:19  (MSK)
ну а потом глядишь в msdn описание ф-ции bind, что означает эта ошибка

или вот тебе ошибки которые могут быть в bind()

WSANOTINITIALISED A successful WSAStartup call must occur before using this function.
WSAENETDOWN The network subsystem has failed.
WSAEACCES  permission denied
WSAEADDRINUSE  A process on the machine is already bound to the same fully-qualified address and the socket has not been marked to allow address reuse with SO_REUSEADDR. For example, the IP address and port are bound in the af_inet case). (See the SO_REUSEADDR socket option under setsockopt.)
WSAEADDRNOTAVAIL The specified address is not a valid address for this machine.
WSAEFAULT The name or namelen parameter is not a valid part of the user address space, the namelen parameter is too small, the name parameter contains an incorrect address format for the associated address family, or the first two bytes of the memory block specified by name does not match the address family associated with the socket descriptor s.
WSAEINPROGRESS A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.
WSAEINVAL The socket is already bound to an address.
WSAENOBUFS Not enough buffers available, too many connections.
WSAENOTSOCK The descriptor is not a socket.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от NSH emailИскать по авторуВ закладки on 19-Дек-02, 16:37  (MSK)
>ну а потом глядишь в msdn описание ф-ции bind, что означает эта
>ошибка
>
>или вот тебе ошибки которые могут быть в bind()
>
>WSANOTINITIALISED A successful WSAStartup call must occur before using this function.
>WSAENETDOWN The network subsystem has failed.
>WSAEACCES  permission denied
>WSAEADDRINUSE  A process on the machine is already bound to the
>same fully-qualified address and the socket has not been marked to
>allow address reuse with SO_REUSEADDR. For example, the IP address and
>port are bound in the af_inet case). (See the SO_REUSEADDR socket
>option under setsockopt.)
>WSAEADDRNOTAVAIL The specified address is not a valid address for this machine.
>
>WSAEFAULT The name or namelen parameter is not a valid part of
>the user address space, the namelen parameter is too small, the
>name parameter contains an incorrect address format for the associated address
>family, or the first two bytes of the memory block specified
>by name does not match the address family associated with the
>socket descriptor s.
>WSAEINPROGRESS A blocking Windows Sockets 1.1 call is in progress, or the
>service provider is still processing a callback function.
>WSAEINVAL The socket is already bound to an address.
>WSAENOBUFS Not enough buffers available, too many connections.
>WSAENOTSOCK The descriptor is not a socket.


Спасибо за совет!

Ошибка получается вот какая:

EAFNOSUPPORT
               Адрес имеет  некорректную  семью  адресов  в  поле
               sa_family.
Она, кстати, не bind()овская, а connect()овская.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от qq Искать по авторуВ закладки on 19-Дек-02, 20:16  (MSK)
>>ну а потом глядишь в msdn описание ф-ции bind, что означает эта
>>ошибка
>>
>>или вот тебе ошибки которые могут быть в bind()
>>
>>WSANOTINITIALISED A successful WSAStartup call must occur before using this function.
>>WSAENETDOWN The network subsystem has failed.
>>WSAEACCES  permission denied
>>WSAEADDRINUSE  A process on the machine is already bound to the
>>same fully-qualified address and the socket has not been marked to
>>allow address reuse with SO_REUSEADDR. For example, the IP address and
>>port are bound in the af_inet case). (See the SO_REUSEADDR socket
>>option under setsockopt.)
>>WSAEADDRNOTAVAIL The specified address is not a valid address for this machine.
>>
>>WSAEFAULT The name or namelen parameter is not a valid part of
>>the user address space, the namelen parameter is too small, the
>>name parameter contains an incorrect address format for the associated address
>>family, or the first two bytes of the memory block specified
>>by name does not match the address family associated with the
>>socket descriptor s.
>>WSAEINPROGRESS A blocking Windows Sockets 1.1 call is in progress, or the
>>service provider is still processing a callback function.
>>WSAEINVAL The socket is already bound to an address.
>>WSAENOBUFS Not enough buffers available, too many connections.
>>WSAENOTSOCK The descriptor is not a socket.
>
>
>Спасибо за совет!
>
>Ошибка получается вот какая:
>
>EAFNOSUPPORT
>            
>   Адрес имеет  некорректную  семью  адресов
> в  поле
>            
>   sa_family.
>Она, кстати, не bind()овская, а connect()овская.

странно
а попробуй сначала обнулять структуру sockaddr
memset(&local,0,sizeof(local));


  Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от NSH emailИскать по авторуВ закладки on 20-Дек-02, 11:57  (MSK)
>странно
>а попробуй сначала обнулять структуру sockaddr
>memset(&local,0,sizeof(local));


Структуру sockaddr уже обнуляю.

С ошибкой, кажется, вышла ошибка :)

49 EADDRNOTAVAIL Cannot assign requested address. Normally results from
             an attempt to create a socket with an address not on this ma╜
             chine.

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

14. "RE: Проблема с вызовом bind()  и recvfrom()"
Сообщение от qq Искать по авторуВ закладки on 20-Дек-02, 18:01  (MSK)
>>странно
>>а попробуй сначала обнулять структуру sockaddr
>>memset(&local,0,sizeof(local));
>
>
>Структуру sockaddr уже обнуляю.
>
>С ошибкой, кажется, вышла ошибка :)
>
>49 EADDRNOTAVAIL Cannot assign requested address. Normally results from
>            
> an attempt to create a socket with an address not
>on this ma╜
>            
> chine.
>
>Ерунда получается. Естественно, я пытаюсь привязать к сокету адрес другой машины. Той,
>с которой хочу связаться.

биндить надо на адрес интерфейса локальной машины, на который собираетесь получать ответы
а посылать так
...
remote.sin_addr.s_addr = inet_addr("192.168.0.1");
remote.sin_port = htons(port);
remote.sin_family = AF_INET;

sendto(sock,buf,SEND_SIZE,0,(struct sockaddr*)&remote,sizeof(remote));

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру