Socket Aufbau

Thomasio

Erfahrenes Mitglied
Nachdem ich mich die letzten Tage quer durchs Web gelesen habe, bin ich mal richtig verwirrt, weil es eine Vielzahl von Möglichkeiten gibt und ich nicht weiss, welche nehmen.

Gross-/Kleinschreibung scheint völlig egal zu sein, bzw. es existiert beides, sockaddr_in und SOCKADDR_IN, aber mein Kleinhirn sagt mir, irgendeinen Unterschied wird es geben.

Initialisieren ist auch optional, bzw. gibt es in mindestens 3 Varianten.
Bei MSDN findet sich

Code:
struct sockaddr_in saServer;

Anderswo gibt es auch

Code:
SOCKADDR_IN addr;
memset(&addr,0,sizeof(SOCKADDR_IN));

oder auch

Code:
SOCKADDR_IN addr = {0};

Nu frage ich mal ganz blöd: Was ist denn der Unterschied, ob ich (wie bei MSDN) "struct" davor schreibe und es nicht initialisiere, oder statt struct davor lieber = {0} dahinter schreibe, oder memset verwende, und egal was der Unterschied ist, welche Variante wäre die Richtige, wenn ich unter Windows einen Listen-Socket für eine Server-Anwendung schreibe?

Bisher mache ich das wie folgt, aber ob das aus der Liste der Möglichkeiten die Beste ist?

Code:
SOCKET s = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addr;
memset(&addr,0,sizeof(SOCKADDR_IN));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(ServerPort);
bind(s,(sockaddr*)&addr,sizeof(SOCKADDR_IN));

// listen() usw.
 
Hey,

also ich programmiere auch schon seit guten 2 Jahren mit Sockets und hab bis jetzt immer deine Version genommen. Also SOCKADDR_IN groß geschrieben, weil ich alle Variablentypen groß schreibe und die Struktur mit memset "geleert". Die anderen Varrianten waren mir bis jetzt nicht bekannt.
Hatte bis jetzt auch nie Probleme damit. Also denk ich, dass es so schon passen wird :-).
Den genauen Unterschied kann ich dir leider nicht sagen, aber falles es hier jemand weiß, würde es mich auch interessieren...

grüße
 
Hallo Thomasio,

die Großschreibung funktioniert nur unter Windows. Microsoft hat die Struktur so deklariert:
C++:
typedef struct sockaddr_in {
#if(_WIN32_WINNT < 0x0600)
    short   sin_family;    
#else //(_WIN32_WINNT < 0x0600)
    ADDRESS_FAMILY sin_family;
#endif //(_WIN32_WINNT < 0x0600)
    USHORT sin_port;
    IN_ADDR sin_addr;
    CHAR sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN;

Damit sollte klar sein, warum sowohl "struct sockaddr_in ... " als auch "SOCKADDR_IN ... " funktioniert.

Gruß
MCoder
 
Dass M$ manche Sachen gerne mehrfach definiert war mir halbwegs klar.
Dass beide Varianten unter Windows funktionieren habe ich durch Ausprobieren mittlerweile selber rausgefunden.
Ich habe nur immer dieses blöde Gefühl, dass es da irgendwo Stolperfallen gibt, denn dass

struct sockaddr_in saServer;

und

SOCKADDR_IN addr = {0};

auch abgesehen von Gross-/Klein und Variablenname nicht das Selbe ist, sehe sogar ich auf den ersten Blick.
Ich würde das Ganze gerne im voraus wasserdicht machen, statt jetzt nach Zufallsprinzip eine Version zu wählen und hinterher bei Programmcrash feststellen, dass ich in genau dieser Variante irgendwas übersehen habe.
 
Schau dir halt die Deklarierung von SOCKADDR_IN an. Vermutlich ist das ein Define und sieht so aus:

C++:
#define SOCKADDR_IN struct sockaddr_in

Edit ich korrigiere mich, es ist ein typedef:

C++:
typedef struct sockaddr_in SOCKADDR_IN;
 
Zuletzt bearbeitet:
Zurück