Probleme mit recvfrom Funktion - UDP

OP #4116763
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.
OP #4116804
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
  }
Moderator Persönliche Seite #4116829
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.
OP #4116891
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.