UDP envoyer comportement une fois connect()
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
struct sockaddr_in addr;
int fd, cnt,ret;
char ch = 'y',msg[] ="How are you";
if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
printf("Error: socket");
exit(1);
}
printf("\nDone socket\n");
/* set up destination address */
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr("128.88.143.113");
addr.sin_port=htons(9090);
ret=connect(fd,(struct sockaddr *)&addr,sizeof(addr));
perror("Connect:");
while(ch == 'y'){
cnt = send(fd,msg,sizeof(msg),0);
if(cnt < 0)
perror("send:");
printf("\nNumber of bytes sent = %d , \n",cnt);
printf("Continue (y/n)\n");
scanf(" %c",&ch);
}
return 0;
}
Le code ci-dessus est compilé pour fonctionner sur une machine Linux.
Supposons que le code ci-dessus envoie des données à un ordinateur à l'adresse IP 128.88.143.113
. Pas de socket UDP est lié au port 9090
à 128.88.143.113
.
Dans le while
boucle, le premier appel à send()
réussit(le paquet qui se passe réellement sur le fil; il a vérifié à l'aide de trace
) et la deuxième send()
échoue avec Connection refused
. Le third send()
réussit et échoue et ainsi de suite.
Je soupçonne qu'après une première send()
la pile reçoit un message d'erreur ICMP(vu dans tcpdump
sur la machine Linux) qui est enregistré dans le support de la structure. La deuxième send()
ne parvient pas a la vue de cette erreur et aucun paquet n'est envoyé. La deuxième send()
permet également d'effacer l'erreur dans le support de la structure. Par conséquent, la troisième send()
réussit et échoue et ainsi de suite.
Questions:
- Cette hypothèse est correcte?
- Ce que devrait être le comportement correct? Est-il un standard RFC définissant un tel comportement?
- Depuis UDP n'a pas d'état de la connexion, ne devrait-on pas tous les
send()
réussir?
OriginalL'auteur Raju V | 2010-12-09
Vous devez vous connecter pour publier un commentaire.
Selon la linux page de man pour udp:
Spécifiquement la RFC (4.1.3.3) membres:
OriginalL'auteur Hasturkun
Votre hypothèse est correcte. Le Linux udp(7) de la page de manuel décrit ainsi la situation:
OriginalL'auteur caf
Il serait intéressant de comparer le code équivalent à l'aide de
sendto()
plutôt queconnect()
etsend()
.Le code montré l'échec de la même manière si vous laissez une période de temps entre chaque envoi, c'est à dire l'erreur ICMP état d'être conservés dans le support pour une période de temps, ou serait-il encore un échec de la deuxième
send()
si vous l'avez laissé, disons, une heure?Je pense que votre hypothèse est correcte, le réseau de la pile est d'essayer d'être intelligent. Il n'y a pas d'autre point quand il pourrait revenir "connexion refusée", car rien n'est envoyé lorsque le
connect()
appel est émis, il stocke tout simplement l'adresse indiquée afin que le support est "logiquement" connecté et les appels àsend()
peut que de travailler.OriginalL'auteur Len Holgate
Pour commencer à l'autre extrémité, si vous connectez un socket UDP, vous pouvez collecter des erreurs sur le prochain envoi. Si vous ne voulez pas, n'est-ce pas se connecter!
OriginalL'auteur user207421
J'ai eu le même problème; et de l'est en raison du fait que le message udp file d'attente est remplie si la personne n'est à l'écoute et de la vidange de la file d'attente.
OriginalL'auteur Chris Maes