2015-01-21 7 views
0

Привет я следующий код: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. Теперь, когда я останавливаю свое приложение, все еще отправляю данные, он не дает мне ошибку. Я всегда получаю записанные байты равными размеру данных, которые я пишу. Как я узнаю, что отправка не удалась или нет?

ответ

2

Это UDP (SOCK_DGRAM), поэтому вы никогда не узнаете об этом. Если вам нужны гарантии надежности, вместо этого используйте TCP. Если вы удовлетворены частично решить только знать, когда принимающая сторона полностью отсутствует/отсутствует, смотрите здесь: ICMP "destination unreachable" packet on udp connected socket

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