sendto не выдает ошибку при отправке

Привет, у меня есть следующий код:

if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
 {
   perror("socket(UDP): ");
   return 0;
 }

 family = AF_INET;
 if((remote_server_ent = gethostbyname2(hptr, family)) == NULL )
 {
   perror("gethostbyname2");
   return 0;
 }

 if (family == AF_INET)
 {  
   sin = (struct sockaddr_in *) addr;
   sin->sin_family = AF_INET;
   sin->sin_port = htons(server_port);;
   bcopy( (char *)remote_server_ent->h_addr, (char *)&(sin->sin_addr), remote_server_ent->h_length );
   return (sizeof(struct sockaddr_in));
 }

  if (sendto(fd, msg_data_ptr, sizeof(Msg_data_hdr), 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) != sizeof(Msg_data_hdr))
  {
    fprintf(stderr, "Error in sending data to the server \n");
  }

Мое приложение указано на порту 7000 IP 127.0.0.1. Теперь, когда я останавливаю свое приложение, которое все еще отправляет данные, оно не дает мне ошибки. Я всегда получаю записанные байты, равные размеру данных, которые я пишу. Как я узнаю, отправка не удалась или нет???


person Achint    schedule 21.01.2015    source источник


Ответы (1)


Это UDP (SOCK_DGRAM), так что вы можете никогда не узнать. Если вам нужны гарантии надежности, используйте TCP. Если вы удовлетворены частичным решением, просто зная, когда принимающая сторона полностью отсутствует/недоступна, см. здесь: Недостижимый пакет назначения ICMP на сокете, подключенном к udp

Общая идея заключается в том, что вы можете получить ICMP-сообщение об ошибке "пункт назначения недостижим", если вы connect() используете свой UDP-сокет, а затем получаете на него данные (для этого вы захотите использовать select() или epoll()). В некоторых сценариях вы обнаружите, что ваши сообщения не доходят до другой стороны... но в других сценариях вы можете этого не сделать, потому что, эй, это UDP.

person John Zwinck    schedule 21.01.2015