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