LINUX.ORG.RU

как получать данные?


0

0

Хочу получать UDP пакеты из сети.

создал сокет привязал на порт, и использую функции recv, но почему-то не работает:

char buf[10000];

int res;

while((res=recv(socket_fd, (void *)buf, sizeof(buf), 0))!=-1){

buf[res]='\0';

printf("%s\n", buf);

}

читаю так.

Может надо другую функцию использовать: read или recvfrom или recvmsg.

Подскажите, пожалуйста.

anonymous

Re: как получать данные?

> Может надо другую функцию использовать: read или recvfrom
> или recvmsg.

любая подойдет, ошибка не в этом. что возвращает read()?
если -1, то что в errno.

idle ★★★★★ ()
Ответ на: Re: как получать данные? от idle

Re: Re: как получать данные?

>> Может надо другую функцию использовать: read или recvfrom >> или recvmsg. > >любая подойдет, ошибка не в этом. что возвращает read()? >если -1, то что в errno.

Проблема в том, что ошибка не возникает, программа просто входит в цикл и...

работает, работает и продолжает работать.

а данные никакие на экран не выводит, хотя они приходят

anonymous ()
Ответ на: Re: Re: как получать данные? от anonymous

Re: Re: Re: как получать данные?

> Проблема в том, что ошибка не возникает, программа просто
> входит в цикл работает, работает и продолжает работать.

блин! еще раз. что возвращает read() ???? распечатайте!

idle ★★★★★ ()
Ответ на: Re: Re: Re: как получать данные? от idle

Re: Re: Re: Re: как получать данные?

> блин! еще раз. что возвращает read() ???? распечатайте!

idle -- не сердитесь так :)

> а данные никакие на экран не выводит, хотя они приходят

anonymous -- Чудес на свете не бывает. Если данные приходят (точнее, если recv хоть как-нибудь да возвращается), что-то -- хотя бы пустые строки -- обязано печататься.

Еще отладчик очень способствует... Поставьте брекпойнт на строчку
buf[res]='\0';
когда стукнетесь об него, посмотрите, чему равен res, и что лежит в buf.
Но почему-то мнится мне, что не стукнетесь...

vnp ()
Ответ на: Re: Re: Re: как получать данные? от idle

Re: Re: Re: Re: как получать данные?

>> Проблема в том, что ошибка не возникает, программа просто >> входит в цикл работает, работает и продолжает работать. > >блин! еще раз. что возвращает read() ???? распечатайте!

Да я же говорю входит в цикл и все.

Ничего не возвращает, он вызывают recv и все... Типа нет данных, которые можно вернуть из recv, хотя они приходят сто пудов.

anonymous ()
Ответ на: Re: Re: Re: Re: как получать данные? от anonymous

Re: Re: Re: Re: Re: как получать данные?

> Да я же говорю входит в цикл и все.

нет уж, извините, вы говорили:

> работает, работает и продолжает работать.

скорее всего у вас bind() не на тот порт (netstat -a --udp).
если, конечно, данные действительно "сто пудов" приходят, что
не мешает проверить: tcpdump udp port PORT_NUM.

idle ★★★★★ ()
Ответ на: Re: Re: Re: Re: Re: как получать данные? от idle

Re: Re: Re: Re: Re: Re: как получать данные?

>> Да я же говорю входит в цикл и все. > >нет уж, извините, вы говорили: > >> работает, работает и продолжает работать. > >скорее всего у вас bind() не на тот порт (netstat -a --udp). >если, конечно, данные действительно "сто пудов" приходят, что >не мешает проверить: tcpdump udp port PORT_NUM.

Ну не будем придираться к словам. вот что выдает

tcpdump udp port PORT_NUM

21:37:52.198849 192.168.0.8.PORT_NUM-fileserver > 255.255.255.255.afs3-fileserver: rx type 0 (80)

21:37:53.807576 192.168.0.8.PORT_NUM-fileserver > 255.255.255.255. afs3-fileserver: rx type 0 (80)

21:37:54.882831 192.168.0.8.PORT_NUM-fileserver > 255.255.255.255.afs3-fileserver: rx type 0 (80)

21:38:02.604222 192.168.0.8.PORT_NUM-fileserver > 255.255.255.255.afs3-fileserver: rx type 0 (80)

Пакеты которые я пытаюсь получить являются широковещательными, так что по-моему мнению пакеты приходят.

Сваял прогу, которая отсылает сообщения, с помощью sendto отправляет данные. Все работает.

А вот пакеты, которые реально приходят из сети почему-то не получаю.

Насчет bind, я привязываюсь на правильный порт, так как программа, которой реально предназначены эти пакеты, при запущенной моей говорит, что порт занят и она не будет, поэтому работать.

Так что не знаю, что и делать.

Может пакеты отправленные на 255.255.255.255 не приходят на мой socket завязанный на 192.168.0.1?

anonymous ()
Ответ на: Re: Re: Re: Re: Re: Re: как получать данные? от anonymous

Re: Re: Re: Re: Re: Re: Re: как получать данные?

> Может пакеты отправленные на 255.255.255.255 не
> приходят на мой socket

вот именно это я и предлагал вам проверить с помощью
tcpdump, хоть вы и писали "сто пудово". для этого запустите
ее на той машине, где вы собираетесь получать данные.
если хост их видит, то socket получит.

> 21:37:52.198849 192.168.0.8.PORT_NUM-fileserver > 255.255.255.255.afs3-fileserver:

это на какой машине? которая должна получать? что такое
afs3-fileserver ? это == номеру порт, на который вы делаете
bind()? ну почему обо всем нужно догадываться ???????????

> Насчет bind, я привязываюсь на правильный порт, так как программа,
> которой реально предназначены эти пакеты, при запущенной моей
> говорит, что порт занят и она не будет, поэтому работать.

ничего это не значит! трудно было набрать netstat -au ?
кроме порта еще и адрес есть, у вас может быть bind() не
на INADDR_ANY.

> мой socket завязанный на 192.168.0.1?

ага, судя по всему так и есть, а ведь просил же netstat сделать!

у вас какая-то очень простая проблема. но на дальнейшие
вопросы сформулированные так же бестолково у меня лично
терпения отвечать не хватит. 

idle ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.