LinuxForum.Fans
Тема

bind udp socket

Автор: Peter 3 сообщений 1203 просмотров
12.09.2014 20:43 #392554

Здравствуйте!

Возникла надобность написать небольшую технологическую программу, работающую через udp-socket.
До сих пор я имел с ними дело только в программе на Qt. Я начал её делать и тут же проверять
и застрял почти сразу. Вот текст, только существенное.

text

#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, текст
[console]Address family not supported by protocol[/console]
Если, как в некоторых местах, назначать просто addr.sin_family=AF_INET,
то пишет, что не может назначить запрошенный адрес.
В Интернете смотрел, но своего случая не нашёл.

Так в чём же дело?

Пётр.

15.09.2014 12:11 · отредактировано #392701

Правильно, конечно,

text
addr.sin_family=AF_INET;

а если пытаться назначить адрес камеры, то bind и пишет, что не может этого сделать.
Если назначить сетевой адрес компьютера, то bind выполняется успешно.
По-видимому, я вообще всё неправильно делаю. Мне надо из программы получить
доступ к камере по командному порту. Общение с камерой по udp-протоколу.
Надо ли мне для этого где-то фиксировать её IP-адрес?

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

Так что, bind можно вызывать только для известных хостов?
Т.е., чтобы так подключиться к видеокамере, её надо включать в домен?

Пётр.

16.09.2014 12:19 · отредактировано #392780

У меня была ошибка: моя программа представляет собой клиентскую часть и bind не нужна.
Достаточно было заполнить sockaddr_in и вызвать socket(), а дальше обращаться к видеокамере
с помощью sendto() и recvfrom(). Однако в книге для случая AF_UNIX bind вызывается
и в клиентской части.

Пётр.

Войдите или зарегистрируйтесь, чтобы ответить.