Mikrocontroller und Digitale Elektronik
›
Thread
Probleme mit recvfrom Funktion - UDP
FS
F. S.
(de0_board)
OP
05.05.2015 11:08
#4116763
Hallo liebe Mitglieder,
ich habe hier ein kleines Problem mit meinem UDP Program. Ich würde
einfach gerne über UDP Pakete empfangen und per rs232_pintf() auf dem
HTerm ausgeben. Ich kann problemlos UDP Pakete verschicken, aber keine
Empfangen.
1 unsigned char pucCC3000_Rx_Buffer [ 40 ];
2 socklen_t tRxPacketLength ;
3
4 volatile uint32_t ulCounter = 0 , localPort = 0 ;
5 uint32_t sockLen = 0 ;
6 sockaddr socketAddr , from ;
7 sockaddr tSocketAddr ;
8 volatile int16_t ReturnValue ;
9
10 //Opening the Socket
11
12 ulSocket2 = socket ( AF_INET , SOCK_DGRAM , IPPROTO_UDP );
13 if ( ulSocket2 < 0 )
14 {
15 rs232_printf ( "Error in Socket deskriptor \n " );
16 }
17 __delay_cycles ( 10000000 );
18 memset ( tSocketAddr . sa_data , 0 , sizeof ( sockaddr ));
19 tSocketAddr . sa_family = AF_INET ;
20 tSocketAddr . sa_data [ 0 ] = 15 ;
21 tSocketAddr . sa_data [ 1 ] = 01 ;
22 __delay_cycles ( 10000000 );
23
24 // rs232_printf("\nbind = %d\n",
25 // bind(ulSocket2, (sockaddr*) &socketAddr, sizeof(sockaddr)));
26
27 if ( bind ( ulSocket2 , & tSocketAddr , sizeof ( sockaddr )) != 0 )
28 {
29 rs232_printf ( "Bind connection FAILED \n " );
30 }
31 __delay_cycles ( 10000000 );
32
33 sockLen = sizeof ( sockaddr );
34 rs232_printf ( "sockLen = %d \n " , sockLen );
35 __delay_cycles ( 10000000 );
36 rs232_printf ( "calling recvfrom \n " );
37 //call recvfrom
38 // ReturnValue = recvfrom(ulSocket2, pucCC3000_Rx_Buffer, CC3000_RX_BUFFER_SIZE, 0, &tSocketAddr, &tRxPacketLength);
39 ReturnValue = recvfrom ( ulSocket2 , ( char * ) & pucCC3000_Rx_Buffer , sizeof ( pucCC3000_Rx_Buffer ), 0 , & tSocketAddr , & tRxPacketLength );
40 __delay_cycles ( 10000000 );
41 while ( ReturnValue != 0 )
42 {
43 __delay_cycles ( 10000000 );
44 rs232_printf ( "ReturnValue = %d \t calling recvfrom again!! \n " , ReturnValue );
45 ReturnValue = recvfrom ( ulSocket2 , pucCC3000_Rx_Buffer , CC3000_RX_BUFFER_SIZE , 0 , & tSocketAddr , & tRxPacketLength );
46 __delay_cycles ( 10000000 );
47 }
Folgende Definitionen sind in der socket.h
1 typedef struct _sockaddr_t
2 {
3 unsigned short int sa_family ;
4 unsigned char sa_data [ 14 ];
5 } sockaddr ;
6
7 typedef struct _sockaddr_in_t
8 {
9 short sin_family ; // e.g. AF_INET
10 unsigned short sin_port ; // e.g. htons(3490)
11 in_addr sin_addr ; // see struct in_addr, below
12 char sin_zero [ 8 ]; // zero this if you want to
13 } sockaddr_in ;
14
15 typedef unsigned long socklen_t ;
Ich bin mir nicht sicher wo der Fehler liegt. Ich verstehe nicht ganz wo
mein Fehler sein soll...ich habe meinen Code mit mehreren Verglichen und
iwie funzt das nicht.
Würde mich über jede Anregung freuen.
Liebe Grüße,
F.S.
PI
Peter II
Gast
05.05.2015 11:22
#4116798
Ich vermisste das Interface und den Port?
addr.sin_port=htons(1234);
addr.sin_addr=inet_addr("127.0.0.1");
FS
F. S.
(de0_board)
OP
05.05.2015 11:26
#4116804
Peter II schrieb:
> Ich vermisste das Interface und den Port?
>
> addr.sin_port=htons(1234);
> addr.sin_addr=inet_addr("127.0.0.1");
Hast Recht. Tut mir Leid. Hier:
1 rs232_printf ( "Opening the socket \n " );
2 ulSocket2 = socket ( AF_INET , SOCK_DGRAM , IPPROTO_UDP );
3 if ( ulSocket2 < 0 )
4 {
5 rs232_printf ( "Error in Socket deskriptor \n " );
6 }
7 unsigned long timeout = 100 ;
8
9 if ( setsockopt ( ulSocket2 , SOL_SOCKET , SOCKOPT_RECV_TIMEOUT , & timeout , sizeof ( timeout ) ) != 0 )
10 {
11 rs232_printf ( "FATAL ERRROR in open_socket \n " );
12 return - 1 ;
13 }
FS
F. S.
(de0_board)
OP
05.05.2015 11:26
#4116805
Frank M. schrieb:
> Welche Plattform?
CC3000...
FS
F. S.
(de0_board)
OP
05.05.2015 11:27
#4116810
Der Port ist 1501...
1 tSocketAddr . sa_data [ 0 ] = 15 ;
2 tSocketAddr . sa_data [ 1 ] = 01 ;
PI
Peter II
Gast
05.05.2015 11:27
#4116813
F. S. schrieb:
> Hast Recht. Tut mir Leid. Hier:
wo denn?
sin_addr wird doch nirgends gesetzt?
FS
F. S.
(de0_board)
OP
05.05.2015 11:28
#4116816
Ich lasse das Leer. Mir wurde gesagt, dann empfängt das Modul von allem.
also 0.0.0.0.
F. S. schrieb:
> Der Port ist 1501...
>
> 1 tSocketAddr . sa_data [ 0 ] = 15 ;
2 > tSocketAddr . sa_data [ 1 ] = 01 ;
Komisch: Auf einer Little-Endian-Maschine ergibt 15 x 256 + 01 bei mir
Port 3841.
Ausserdem ist die Schreibweise "01" ziemlich gewagt. Du weisst, dass ein
C-Compiler so etwas als Oktalzahl auffasst? Bei 01 spielt es keine
Rolle, bei anderen Zahlen könntest Du Dein blaues Wunder erleben.
FS
F. S.
(de0_board)
OP
05.05.2015 12:10
#4116891
Ich habs jetzt mit der htons probiert um Fehler zu vermeiden:
1 memset ( & tSocketAddr , 0 , sizeof ( sockaddr_in ));
2 tSocketAddr . sin_family = AF_INET ;
3 tSocketAddr . sin_port = htons ( 5555 );
4 tSocketAddr . sin_addr . s_addr = 0 ;
Habs dann im bind gecastet:
1 if ( bind ( ulSocket2 , ( sockaddr * ) & tSocketAddr , sizeof ( sockaddr )) != 0 )
2 {
3 rs232_printf ( "Bind connection FAILED \n " );
4 }
hängt leider noch immer. Ich benutzte das Program PacketSender. Mit dem
schicke auf den Port 5555 ein "hallo". Leider empfange ich immer nur 0
zurück.
↑ Nach oben
← Zurück zu Mikrocontroller und Digitale Elektronik
Antwort schreiben