Forum: Mikrocontroller und Digitale Elektronik Probleme mit recvfrom Funktion - UDP


von F. S. (de0_board)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Welche Plattform?

von Peter II (Gast)


Lesenswert?

Ich vermisste das Interface und den Port?

addr.sin_port=htons(1234);
addr.sin_addr=inet_addr("127.0.0.1");

von F. S. (de0_board)


Lesenswert?

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
  }

von F. S. (de0_board)


Lesenswert?

Frank M. schrieb:
> Welche Plattform?

CC3000...

von F. S. (de0_board)


Lesenswert?

Der Port ist 1501...
1
tSocketAddr.sa_data[0] = 15;
2
tSocketAddr.sa_data[1] = 01;

von Peter II (Gast)


Lesenswert?

F. S. schrieb:
> Hast Recht. Tut mir Leid. Hier:

wo denn?

sin_addr wird doch nirgends gesetzt?

von F. S. (de0_board)


Lesenswert?

Ich lasse das Leer. Mir wurde gesagt, dann empfängt das Modul von allem. 
also 0.0.0.0.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von F. S. (de0_board)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.