?? TCP/IP UDP oder TCP ??



  • Hallo,

    habe hier einen Ausschnitt eines Codes aus einer Klasse, die ich verwenden muß.
    Das Socket wird in dem Code mit SOCK_STREAM, also TCP angelegt, dem stuct addrinfo wird als SockType SOCK_DGRAM (UDP) zugewiesen.

    m_SockFd = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( m_SockFd != -1 )
    {
      struct addrinfo hints, *res;
    
      bzero (&hints, sizeof (struct addrinfo));
      hints.ai_family   = AF_INET;          // preferred connection
      hints.ai_socktype = SOCK_DGRAM;      	// for udp
    
      ...
      ...
    }
    

    Welche Zuweisung gilt jetzt? Ist das jetzt eine TCP oder ein UDP Socket?

    Danke.

    Gruß
    dziuba



  • hi dziuba,

    m_SockFd = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( m_SockFd != -1 )
    {
      struct addrinfo hints, *res;
    
      bzero (&hints, sizeof (struct addrinfo));
      hints.ai_family   = AF_INET;     // preferred connection
      hints.ai_socktype = SOCK_DGRAM;  // the way the socket will transport the data
      hints.ai_protocol = IPPROTO_UDP; // use udp protocol
    
      ...
      ...
    }
    

    So kannst du sicher sein das UDP verwendet wird. Für TCP ist es:

    m_SockFd = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( m_SockFd != -1 )
    {
      struct addrinfo hints, *res;
    
      bzero (&hints, sizeof (struct addrinfo));
      hints.ai_family   = AF_INET;     // preferred connection
      hints.ai_socktype = SOCK_STREAM; // the way the socket will transport the data
      hints.ai_protocol = IPPROTO_TCP; // use tcp protocol
    
      ...
      ...
    }
    

    - loco



  • Gut. Du setzt in deiner Struktur irgendwelche Werte ein. Aber wie assoziierst du die Struktur mit deinem Socket?!



  • Also, zunächst zählt erstmaldass, was man bei "socket(...)" gesagt hat - natürlich sollte man dies dann auch in dem Struct so verwenden, damit man nicht andere Entwickler verwirrt, wie hier mit <dziuba> geschehen - oder man löscht noch besser diese Zeile direkt.

    Dann habe ich aber selber noch ein Frage. Warum verwendet ihr eigentlich "struct addrinfo"? Sowohl "bind" als auch "connect" verlangen "struct sockaddr" bzw. eine erweiterung davon. Für IP ist dies doch "struct sockaddr_in", dies verwende ich jedenfalls immer und es funktioniert wunderbar. Dort trage ich dann im Fall eines Servers (bind) folgendes in die Struktur:

    hints.sin_family = AF_INET;
    hints.sin_port = <Portnummer auf der ich lauschen will>;
    hints.sin_addr.s_addr = INADDR_ANY; // falls ich dies nicht weiter einschränkenwill

    Und bei einem Client (connect) mache ich quasi das selbe, bis auf die letzte Zeile:

    hints.sin_family = AF_INET;
    hints.sin_port = <Portnummer, an die meine Anfrage gerichtet ist>;
    hints.sin_addr.s_addr = <IP-Adresse, zu der ich Kontakt aufnehmen will>

    Was kann denn "struct addrinfo"? Habe ich etwa bisher immer etwas falsch gemacht?


Anmelden zum Antworten