#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.UDP отправить поведение после подключения()
Предположим, что приведенный выше код отправляет данные на машину по IP-адресу 128.88.143.113
. Нет гнезда UDP привязано к порту 9090
по адресу 128.88.143.113
.
В цикле while
, первый вызов send()
успешно (пакет фактически выходит на проволоке, проверил его с помощью trace
), а второй send()
терпит неудачу с Connection refused
. third send()
преуспевает, а четвертый терпит неудачу и так далее.
Я подозреваю, что после первого send()
стек получает сообщение об ошибке ICMP (видно на tcpdump
на машине Linux), которое сохраняется в структуре сокета. Второй send()
не удается увидеть эту ошибку, и пакет не отправляется. Второй send()
также очищает ошибку в структуре сокета. Поэтому третий send()
преуспевает, а четвертый терпит неудачу и так далее.
Вопросы:
- Является ли это предположение верно?
- Какое должно быть правильное поведение? Существует ли какой-либо стандарт RFC, определяющий такое поведение?
- Поскольку UDP не поддерживает какое-либо состояние соединения, не должно ли каждый
send()
преуспеть?
Я вижу подобное поведение на машине с архитектурой при отправке через интерфейс псевдонима. Было ли это разрешено? –