Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: bind udp socket  (Прочитано 1896 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3037
    • Просмотр профиля
bind udp socket
« : 13 Сентября 2014, 12:56:29 »
Здравствуйте!

Возникла надобность написать небольшую технологическую программу, работающую через udp-socket.
До сих пор я имел с ними дело только в программе на Qt. Я начал её делать и тут же проверять
и застрял почти сразу. Вот текст, только существенное.
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main() {
int nb,nsfd,len;
char buf[160];
unsigned short int ucp=50700;
struct sockaddr_in addr;
  strcpy(buf,"192.168.1.34");len=sizeof(addr);
  addr.sin_addr.s_addr=inet_addr(buf);;
  addr.sin_family=htons(AF_INET);
  addr.sin_port=htons(ucp);
  nsfd=socket(AF_INET,SOCK_DGRAM,0);
  nb=bind(nsfd,(struct sockaddr *)(&addr),len);
  if(nb<0){strcpy(buf+20,strerror(errno));
  fprintf(stdout,"%d %s\n",errno,buf+20);}
  return 0;
}
Однако bind завершается неудачно, код ошибки 97, текст
Address family not supported by protocol
Если, как в некоторых местах, назначать просто addr.sin_family=AF_INET,
то пишет, что не может назначить запрошенный адрес.
В Интернете смотрел, но своего случая не нашёл.

Так в чём же дело?
Пётр.

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Re: bind udp socket
« Ответ #1 : 13 Сентября 2014, 21:30:31 »
htons там не нужен

addr.sin_family=AF_INET;

А дальше смотри почему программа не может слушать данный сокет, возможно он уже используется, либо интерфейса для такого IP нет:

netstat -tulpn
ifconfig

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3037
    • Просмотр профиля
Re: bind udp socket
« Ответ #2 : 13 Сентября 2014, 22:31:41 »
Я ещё и не пытался слушать сокет, т.к. остановился на том, что не выполняется bind.
Там, где я это пробовал, web-камера с этим адресом была подключена и рабочая программа
с ней работала. Первоначально, конечно, я и пробовал
addr.sin_family=AF_INET;но сейчас не помню, была та же ошибка или что не может назначитаь адрес.
Сейчас у меня её нет, когда снова займусь, попробую вывести дополнительную
инфромацию. М.б., пример в тексте упрощённый и чего-то не хватает и надо
создавать объект типа host. Но вроде бы и по man'ам тоже достаточно в начале
вызова socket и bind.

Пётр.

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3037
    • Просмотр профиля
Re: bind udp socket
« Ответ #3 : 15 Сентября 2014, 11:54:13 »
Пока ничего не получилось, с
addr.sin_family=AF_INET;bind заканчивается с кодом ошибки 99, не может назначить запрошенный порт.
Камера включена, пингуется. В выводе netstat этого порта нет.
М.б., тут какая-то дополнительная сложность из-за того, что адрес не локальный,
а сетевой? Т.е. я вообще всё неправильно делаю. Если в качестве IP-адреса
указать не адрес камеры, а адрес компьютера, то bind, конечно, выпоняется успешно.
Мне-то надо с компьютера из этой технологической программы получить доступ к камере.

Общение с камерой происходит по udp-протоколу. Надо ли где-нибудь фиксировать её IP-адрес?

Я нашёл в книге подходящий пример, я примерно к этому и стремился.
Т.е. моя программа будет клиентом, но там доменное имя сервера с помощью программы
gethostbyname() преобразуется в "structure hostent", а я-то уже знаю ip-адрес камеры?

Пользователь решил продолжить мысль 15 Сентября 2014, 14:50:07:
Или bind можно применять только для известного хоста?
И что, если мне надо сделать это для видеокамеры, я должен включать её в домен
или можно как-то проще?
« Последнее редактирование: 15 Сентября 2014, 14:50:08 от Peter_I »
Пётр.

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Re: bind udp socket
« Ответ #4 : 15 Сентября 2014, 17:28:30 »
ты пишешь UDP сервер а тебе нужен клиент.
и да, gethostbyname не нужен если используется IP.

http://www.cs.ucsb.edu/~almeroth/classes/W01.176B/hw2/examples/udp-client.c

Оффлайн Peter_I

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3037
    • Просмотр профиля
Re: bind udp socket
« Ответ #5 : 15 Сентября 2014, 22:20:33 »
ты пишешь UDP сервер а тебе нужен клиент.
и да, gethostbyname не нужен если используется IP.

http://www.cs.ucsb.edu/~almeroth/classes/W01.176B/hw2/examples/udp-client.c
Да, я уже осознал, что мне нужен клиент, а bind на серверной стороне, насколько я сейчас
помню из примеров. С другой стороны, в программе на Qt, работающей с видеокамерой, для
объекта типа QUdpSocket вызывается его bind, а при передаче дейтаграммы одним из аргументов
функции является IP-адрес камеры и при получении дейтаграммы известен IP-адрес пославшей её
камеры. Благодарю за ссылку, завтра попробую.


Пользователь решил продолжить мысль 16 Сентября 2014, 12:09:49:
Сегодня всё получилось, делал по "man sendto, man recvfrom", видеокамера отвечает на обращение.
Однако в книге в примере клиентской части для случая AF_UNIX тоже есть bind.
« Последнее редактирование: 16 Сентября 2014, 12:09:49 от Peter_I »
Пётр.

 

Страница сгенерирована за 0.03 секунд. Запросов: 25.