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:

  1. Cette hypothèse est correcte?
  2. Ce que devrait être le comportement correct? Est-il un standard RFC définissant un tel comportement?
  3. Depuis UDP n'a pas d'état de la connexion, ne devrait-on pas tous les send() réussir?
Je vois le même comportement sur une arch linux de la machine lors de l'envoi de plus d'un alias d'interface. Cela a été résolu?

OriginalL'auteur Raju V | 2010-12-09