Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » udp socket empfängt nichts

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.12.2007, 18:55 Uhr
cyanrigger



Gruezi Cler

Ich stelle die Frage hier im allgemeinen Forum, weil die Socketgeschichten zu 90% komatibel zwischen den Betriebsystemen sind. In meinem Code sind ein paar windows-socket aufrufe drinnen - bitte hängt euch nicht daran auf.
Ich hab das alles am Anfang auch unter Linux probiert. Das Programm soll nur einen UDP-Socket öffnen und dann zehnmal hintereinander Pakete vom Port 1900 empfangen und den Payload davon anzeigen, aber er empfängt einfach nichts.
- Unter netstat sehe ich wie mein Programm auf dem richtigen Port lauscht - aber er zeigt nichts an - bleibt immer bei dem recvfrom()-call stehen.
- Ich generiere UDP-Datagramme für den Port 1900 mit einem packet-generator unter linux und schicke sie intervallweise an meinen Rechner.
- Ich sehe im Wireshark das die Pakete am richtigen Port ankommen (und dass die in Ordnung sind) - aber das Programm zeigt nichts an!

Hier mein Programm:


C++:

#include <winsock2.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <iphlpapi.h>
#include <errno.h>

#pragma argsused
int main(void)
{
   WSADATA wsaData;
   SOCKET upnp_sock;
   int i=0;
   int j=0;
   int bytes=0;
   int remo_addr_len;
   struct sockaddr_in remo_addr;
   struct sockaddr_in listen_addr;
   char buff[500];
   WSAStartup(MAKEWORD(2, 2), &wsaData) ;

   upnp_sock = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_IP, NULL, 0, 0);
   printf("\nSOCKET ERROR:%i\n",WSAGetLastError());

   listen_addr.sin_addr.s_addr = inet_addr("192.168.0.5");
   listen_addr.sin_port = htons(1905);
   listen_addr.sin_family = AF_INET;

   bind(upnp_sock, (struct sockaddr*) &listen_addr, sizeof(listen_addr));
   printf("\nBIND ERROR:%i\n",WSAGetLastError());

   printf("Versuche irgendetwas zu empfangen...\n");
   remo_addr_len = sizeof(remo_addr);
   while (j<10)
   {
      i=0;
      bytes=recvfrom(upnp_sock, buff, 30, 0, (struct sockaddr *) &remo_addr, &remo_addr_len);
      if (bytes == -1)
      {
         printf("\nRECVFROMERROR:%i\n",WSAGetLastError());
      }
      printf("Bytes:%d\n", bytes);
      buff[bytes]='\0';
      bytes=0;
      while (buff[i] != '\0' )
      {
         printf("%c", buff[i++]);
      }

      printf("\n\n#############\n\n");
      memset(&buff, '\0', sizeof(buff)-1);
      j++;
   }
   printf("Feddish\n");
   closesocket (upnp_sock);
   getchar();

   return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.12.2007, 19:09 Uhr
Tron



Moin,

ohne lange zu gucken, welcher Port denn nun (Port 1900)
oder

Zitat:
listen_addr.sin_port = htons(1905);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.12.2007, 15:10 Uhr
cyanrigger



O.Ops

natürlich Port 1900. Ich hatte es nur mal mit Port 1905 probiert - hat aber auch nichts gebracht. Hülf, Tron!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.12.2007, 16:56 Uhr
Tron



Moin,


Zitat:
upnp_sock = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_IP, NULL, 0, 0);


schon mal IPPROTO_UDP verwendet?

Ansonsten fällt mir auf:

Zitat:
bytes=recvfrom(upnp_sock, buff, 30, 0, (struct sockaddr *) &remo_addr, &remo_addr_len);


wie kommst Du auf die 30, wenn Dein buff doch 500 ist.
Das war nur mal auf die schnelle überflogen.

Ansonsten mal bei MSDN rein schauen da gibt es bestimmt ein Beispiel.

Dieser Post wurde am 15.12.2007 um 16:57 Uhr von Tron editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.12.2007, 17:55 Uhr
Pablo
Supertux
(Operator)


--> hat nichts mit ANSI C zu tun
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.12.2007, 17:16 Uhr
Tron



Moin,

hatte gerade nichts anderes vor.

Dein Code mit leichter Änderung.


C++:
#include <winsock2.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <iphlpapi.h>
#include <errno.h>

#pragma argsused
int main(void)
{
   WSADATA wsaData;
   SOCKET upnp_sock;
   int i=0;
   int j=0;
   int bytes=0;
   int remo_addr_len;
   struct sockaddr_in remo_addr;
   struct sockaddr_in listen_addr;
   char buff[500];
   WSAStartup(MAKEWORD(2, 2), &wsaData) ;

   upnp_sock = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
   printf("\nSOCKET ERROR:%i\n",WSAGetLastError());

   listen_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
   listen_addr.sin_port = htons(1905);
   listen_addr.sin_family = AF_INET;

   bind(upnp_sock, (struct sockaddr*) &listen_addr, sizeof(listen_addr));
   printf("\nBIND ERROR:%i\n",WSAGetLastError());

   printf("Versuche irgendetwas zu empfangen...\n");
   remo_addr_len = sizeof(remo_addr);
   i=1;
   while (j<10)
   {
      bytes=recvfrom(upnp_sock, buff, sizeof(buff), 0, (struct sockaddr *) &remo_addr, &remo_addr_len);
      if (bytes == -1)
      {
         printf("\nRECVFROMERROR:%i\n",WSAGetLastError());
      }
      printf("Bytes:%d\n", bytes);
      buff[bytes]='\0';
      bytes=0;
      
      // Ausgabe des Durchlauf und Inhalt von buff.
      printf("%d . %s",i, buff);
      /*while (buff[i] != '\0' )
      {
         printf("%s", buff);
      }*/


      printf("\n\n#############\n\n");

      // Bestätigung an Client senden.
      sendto( upnp_sock, "OKAY", 5, 0, (SOCKADDR*)&remo_addr, remo_addr_len);

      memset(&buff, '\0', sizeof(buff)-1);
      j++;
      i++;
   }
   printf("Feddish\n");
   closesocket (upnp_sock);
   getchar();

   return 0;
}


Test mit UDP-Client


C++:
#include <stdio.h>
#include <winsock2.h>

#define  SERVER_PORT       1905
#define  BUF_MAXLEN         256

long WinsockStartup();


int main()
{
    SOCKET sock;
    SOCKADDR_IN addr;
    long   rc;
    
    char buffer[BUF_MAXLEN];
    char hostAdress[] = "127.0.0.1";
            
    rc = WinsockStartup();
    if (rc == SOCKET_ERROR)
    {
        printf("Error: Winsock Startup failed: %d\n", WSAGetLastError() );
        return 0;
    }

    // socket anlegen
    sock=socket(AF_INET,SOCK_DGRAM,NULL);
    if (sock == INVALID_SOCKET)
    {
        printf("Error: Cannot create Socket: %d\n", WSAGetLastError() );
        return 0;
    }

    memset(&addr,0,sizeof(SOCKADDR_IN));        // zuerst alles auf 0 setzten
    addr.sin_family      = AF_INET;             // Adress Familie
    addr.sin_port        = htons(SERVER_PORT);  // Port-Nummer
    addr.sin_addr.s_addr = inet_addr(hostAdress); // host
    
    for( ;; ) {
        sendto( sock, "test", 5, 0, (SOCKADDR*)&addr, sizeof (SOCKADDR));
        rc = recvfrom( sock, buffer, sizeof buffer, 0, 0, 0);
        if( rc > 0 ) printf("%s\n", buffer);
        //else         printf("%d %d .",rc, WSAGetLastError () - WSABASEERR);
        else         printf(".");
        Sleep( 500 );
    }
    return 0;
}

/* ********************************************************************
*/

long WinsockStartup()
{
    long rc;
    
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested = MAKEWORD(2, 1);
    
    rc = WSAStartup( wVersionRequested, &wsaData );
    return rc;
}



Sollte jetzt auch bei Dir funktionieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: