2010-11-20 15 views
3

pour quoi en particulier les options de socket sont utilisées par exemple setsockopt() et getsockopt() dans la programmation socket?à propos de setsockopt() et getsockopt() fonction

+2

Google: http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_15.html#SEC266 http://www.cs.utah.edu/dept/old/ texinfo/glibc-manual-0.02/library_15.html # SEC265 La lecture reste un exercice pour le lecteur. –

+0

Pour définir les options de socket documentées. La réponse à cette question devrait être recherchée dans les spécifications et les manuels, pas dans un forum. – EJP

Répondre

4

Par exemple, vous voulez définir ou savoir recevoir la taille de la mémoire tampon

1)

int skt, int sndsize; 
err = setsockopt(skt, SOL_SOCKET, SO_RCVBUF, (char *)&sndsize, 
           (int)sizeof(sndsize)); 

err = getsockopt(skt, SOL_SOCKET, SO_RCVBUF, (char *)&sockbufsize, &size); 

2) Réutiliser adresse

int on = 1; 
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) 
+1

Pour la réutilisation de l'adresse, setsockopt() est utilisé. Mais où cette fonction devrait être utilisée? Du côté serveur ou côté client? –

1

Pour many différentes choses, y compris changer la taille d'envoi et recevoir des tampons, la longueur des délais, la multidiffusion, maintenir la connexion active, en désactivant l'algorithme de Nagel, etc.

Il existe des niveaux d'options en fonction de la couche réseau avec laquelle interagir: socket, IP, TCP, etc.

2

Comme déjà mentionné, ils sont utilisés pour définir/obtenir diverses options pour un socket. Par exemple, si vous testez une application serveur qui plante, vous ne devriez pas attendre un certain nombre de minutes avant que le noyau ne vous permette de réutiliser le port en évitant les messages d'erreur "Adresse déjà utilisée". Ceci peut être évité si vous utilisez l'option SO_REUSEADDR, en laissant d'autres sockets se lier au même port, sauf si un écouteur actif est déjà lié.

Vous pouvez également récupérer des données sur un socket, telles que le nombre de paquets/retransmissions perdus, etc. en utilisant le TCP_INFO sur des machines Linux.

Fondamentalement, vous pouvez configurer tous les paramètres fins.

Options pour setsockopt(2) et getsockopt(2).

+2

Les deux liens ne fonctionnent plus, veuillez les corriger. –

2

Superficiellement, prises ressemblent à un tube bidirectionnel qui est utile parce que les appels système standard tels que write, read, close peut être utilisé sur eux comme sur des tuyaux normaux ou même des fichiers. Même si vous ajoutez des appels spécifiques à une socket (listen, connect, bind, accept), il existe un niveau d'abstraction utile qui cache les détails en faveur de la notion de socket de streaming ou de datagramme. Mais dès que des détails spécifiques au protocole entrent en jeu et que des paramètres spécifiques doivent être réglés (par exemple, tampons d'envoi/réception, paramètres de délai), une interface très générique est nécessaire pour tenir compte des différents paramètres et de leurs données spécifiques formats. getsockopt, setsockopt font partie de cette interface générique.

int getsockopt(int sockfd, int level, int optname, 
       void *optval, socklen_t *optlen); 
int setsockopt(int sockfd, int level, int optname, 
       const void *optval, socklen_t optlen); 

Les options spécifiques au protocole sont sélectionnées à l'aide level et optname et les données spécifiques au protocole est caché dans un tampon, de sorte que les deux appels système ne ont pas besoin de savoir quoi que ce soit sur les paramètres de chaque protocole du système d'exploitation peut support - il suffit que votre application et l'implémentation du protocole connaissent ces détails.