The OpenNET Project / Index page

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




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

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

    • RE: Проблема с вызовом bind()  и recvfrom(), !*! NSH, 11:03 , 18-Дек-02 (2)
      >>Добрый день! Помогите решить следующую проблему. Пишу 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, то все ок!


      • RE: Проблема с вызовом bind()  и recvfrom(), !*! Bizon, 12:23 , 18-Дек-02 (3)
        >>>Добрый день! Помогите решить следующую проблему. Пишу 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??

        • RE: Проблема с вызовом bind()  и recvfrom(), !*! NSH, 13:04 , 18-Дек-02 (4)
          >>>>Добрый день! Помогите решить следующую проблему. Пишу 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. Разве это имеет отношение к моей проблеме????

          • RE: Проблема с вызовом bind()  и recvfrom(), !*! Bizon, 13:24 , 18-Дек-02 (5)
            >>>>>Добрый день! Помогите решить следующую проблему. Пишу 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.

            • RE: Проблема с вызовом bind()  и recvfrom(), !*! NSH, 14:45 , 18-Дек-02 (6)
              >>>>>>Добрый день! Помогите решить следующую проблему. Пишу 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 вообще не вызываю, никаких опций не устанавливаю. А проблема остается.

              • RE: Проблема с вызовом bind()  и recvfrom(), !*! Bizon, 16:18 , 18-Дек-02 (7)
                >>>>>>>Добрый день! Помогите решить следующую проблему. Пишу 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));

                • RE: Проблема с вызовом bind()  и recvfrom(), !*! NSH, 11:14 , 19-Дек-02 (8)
                  >>>>>>>>Добрый день! Помогите решить следующую проблему. Пишу 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)) - не работае никак.

      • RE: Проблема с вызовом bind()  и recvfrom(), !*! qq, 16:13 , 19-Дек-02 (9)
        >>>Добрый день! Помогите решить следующую проблему. Пишу 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)

        • RE: Проблема с вызовом bind()  и recvfrom(), !*! qq, 16:19 , 19-Дек-02 (10)
          ну а потом глядишь в 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.

          • RE: Проблема с вызовом bind()  и recvfrom(), !*! NSH, 16:37 , 19-Дек-02 (11)
            >ну а потом глядишь в 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()овская.

            • RE: Проблема с вызовом bind()  и recvfrom(), !*! qq, 20:16 , 19-Дек-02 (12)
              >>ну а потом глядишь в 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));

              • RE: Проблема с вызовом bind()  и recvfrom(), !*! NSH, 11:57 , 20-Дек-02 (13)
                >странно
                >а попробуй сначала обнулять структуру 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.

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

                • RE: Проблема с вызовом bind()  и recvfrom(), !*! qq, 18:01 , 20-Дек-02 (14)
                  >>странно
                  >>а попробуй сначала обнулять структуру 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));





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

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