2010-07-23 9 views
2

Je suis en train d'apprendre la programmation socket en C & téléchargé un simple fichier source du serveur tcp. Je comprends toutes les lignes à l'exception des paramètres 2e dans ces fonctions:Accepter() fonction; Serveur tcp simple en C

accept(socket_fd, (struct sockaddr *)&client, &length); 

bind(socket_fd, (struct sockaddr *)&server, length); 

Les + acceptent les fonctions de grippage sont les fonctions typiques « sys/types.h » & « sys/socket.h », et la page de manuel décrit comme un pointeur vers une structure, mais je ne peux toujours pas comprendre ce qui se passe vraiment ici. Est-ce que quelqu'un peut expliquer ce qui se passe dans le deuxième paramètre? Les crochets, le pointeur et les symboles d'adresse me confondent dans la même expression.

Merci d'avance!

Répondre

3

Le symbole & signifie essentiellement "obtenir l'adresse de la valeur/de l'objet". Le (struct sockaddr *) est une distribution. Il indique au compilateur que vous voulez traiter l'adresse comme un pointeur vers une structure sockaddr. Donc, ensemble, il est dit au compilateur que client peut être traité comme une structure sockaddr et de passer l'adresse de la fonction. Dans le cas de la fonction accept, l'adresse de la prise de connexion sera stockée dans la structure donnée.

2

Ce qui se passe est que la fonction accept et bind attendent struct sockaddr pointeurs et vos client et server variables sont probablement déclarée (struct sockaddr *). Ainsi, afin d'éviter un avertissement dans C ou une erreur du compilateur C++ dans , vous avez besoin d'un casting explicite que vous faites en mettant l'expression:

(struct sockaddr *) 

Avant paramètre.

Et vous avez besoin de l'esperluette, car client et server ne sont pas des pointeurs. Ils ont probablement été déclarés comme:

struct sockaddr_in client, server; 
+0

Merci beaucoup, c'est extrêmement utile. C'est exactement comme cela que les structures ont été déclarées. Si je les déclarais comme pointeurs, comment cela changerait-il les paramètres? – Jeremy

+0

@Jeremy: S'il s'agissait de pointeurs (de type sockaddr), vous utiliseriez bind (fd, client, & length), par exemple. – ZachS

+0

Je pense que c'est plus facile à comprendre pour moi ... merci beaucoup, vous avez été très utile. – Jeremy

0

Il est également important de mentionner que les structures sont étroitement liées. Jetez un oeil à la photo from Stevens UnP.