» »

[c] ne sprejme UDP paketa

[c] ne sprejme UDP paketa

slovencl ::

Naredil sem en programček (v linuxu), ki pošlje, nato pa sprejme UDP paket. Pošlje ga, pri sprejemu pa mi recvfrom vedno vrne -1, čeprav paket pride (ni pretekel timeout čas). Ni mi jasno zakaj oz. ali lahko na kak način bolj natančno ugotovim, kaj ga moti. Sem skeniral z wiresharkom, in zgleda vse ok.

Ali ima kdo idejo, kaj bi lahko bil problem?

Spodaj je kodica in pa printcrean obeh tx in rx UDP paketa.

#define PORT 0x6540

int sockfd;
struct sockaddr_in sockaddr;
memset(&sockaddr, 0, sizeof(sockaddr));

if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
    perror("socket creation failed");
    exit(EXIT_FAILURE);
  }

sockaddr.sin_family = AF_INET; // (AF_INET is used for IPv4 addresses)                                                              
sockaddr.sin_port = htons(PORT); // destination port                                                                       
sockaddr.sin_addr.s_addr = inet_addr(device_ip);

struct timeval read_timeout;
read_timeout.tv_sec = 1;
read_timeout.tv_usec = 0;
setsockopt(soockfd, SOL_SOCKET, SO_RCVTIMEO, &read_timeout, sizeof read_timeout); // timeout    

// čaka na odgovor...
int rx_udp_byte_count = 0;
rx_udp_byte_count = recvfrom(sockfd, (char *)rx_buffer, MAXLINE, MSG_WAITALL, (struct sockaddr *) &sockaddr, NULL);
printf("rx_udp_byte_count: %i \n", rx_udp_byte_count); // tole vedno javi -1


 tx paket

tx paket


 rx paket - tega ne sprejme

rx paket - tega ne sprejme

  • spremenil: slovencl ()

slovencl ::

Mogoče če samo dodam. V programu imam najprej sendto, nato pa recvfrom. Nimam pa bind, ker kot razumem sendto sam binda.

joze67 ::

errno bi moral imeti bolj podroben opis napake.

misek ::

Iz man recvfrom

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);

recvfrom()
If src_addr is not NULL, and the underlying protocol provides the
source address of the message, that source address is placed in the
buffer pointed to by src_addr. In this case, addrlen is a value-result
argument. Before the call, it should be initialized to the size of the
Ker imaš src_addr != NULL in addrlen == NULL se src_addr ne vpiše.
Ali tudi za src_addr uporabiš NULL ali pa podaj addrlen.

Napaka (errno) v tvojem primeru je pa verjetno Bad address.

srus ::

"Sem skeniral z wiresharkom, in zgleda vse ok."

Meni pa ne zgleda OK.

Med oddajo in sprejemom paketa so minile štiri sekunde, ti pa imaš socket timeout nastavljen na eno sekundo. Res potrebujemo errno za več informacij.

Kateri proizvajalec pa ima MAC a2:c2:61? Kakšen privatni hack projekt?

Poglej vrstico 1985. Tam ti sprejemnik lepo odgovori, da je destination port (43321) unreachable. Tako, da paket sicer pride v IP stack, ampak ne do UDP porta. Ali lahko na sprejemniku, ko čaka na paket, poženeš sudo netstat -anp da boš videl, če ti kdo res posluša na portu 43321.

slovencl ::

Hvala za ideje, sem rešil: sem dodal print napake in mi javi napako 14. Potem sem zguglal in našel rešitev: https://stackoverflow.com/questions/138... Zdej dela BP :)
BTW, ta proizvajalec sem jest :)

misek ::

Torej si naredil tako sem ti jaz napisal?

slovencl ::

Mišek, imel si prav.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] bind

Oddelek: Programiranje
61450 (1228) fiction
»

SMTP v c -ju

Oddelek: Programiranje
282119 (1260) BigWhale
»

Delo z omrezjem v linuxu

Oddelek: Programiranje
101295 (1141) CCfly
»

C: connect() funkcija, kako nastaviti timeout

Oddelek: Programiranje
231766 (1547) fefko-the-bulldog
»

Casovni problem v C/C++

Oddelek: Programiranje
91255 (1156) sid_dabster

Več podobnih tem