Поведение при отправке UDP после 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;  
}  

Приведенный выше код скомпилирован для работы на машине Linux.

Предположим, что приведенный выше код отправляет данные на машину по IP-адресу 128.88.143.113 . UDP-сокет не привязан к порту 9090 в 128.88.143.113 .

В цикле while первый вызов send () успешно (пакет фактически уходит по проводу; проверил его с помощью трассировки ) и второй send () завершился ошибкой с В соединении отказано . третий send () завершается успешно, четвертый не работает и т. Д.

Я подозреваю, что после первого send () стек получает сообщение об ошибке ICMP (см. tcpdump на машине Linux), который сохраняется в структуре сокета. Вторая send () завершается ошибкой при обнаружении этой ошибки, и фактически никакой пакет не отправляется. Вторая send () также очищает ошибку в структуре сокета. Следовательно, третий send () завершается успешно, четвертый - нет и т. Д.

Вопросы:

  1. Верно ли это предположение?
  2. Каким должно быть правильное поведение? Существует ли какой-либо стандарт RFC, определяющий такое поведение?
  3. Поскольку UDP не поддерживает какое-либо состояние соединения, не должны ли каждые send () выполняться успешно?
8
задан Barracuda 1 February 2015 в 19:08
поделиться