sendto在发送时没有给出错误

时间:2015-01-21 04:54:32

标签: c linux 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");
  }

我的APP列在端口7000 IP 127.0.0.1上。   现在,当我停止我的应用程序仍然发送发送数据,它不会给我错误。我总是把写入的字节等于我正在写的数据大小。我怎么知道发送是否失败???

1 个答案:

答案 0 :(得分:2)

这是UDP(SOCK_DGRAM),所以你可能永远都找不到。如果需要可靠性保证,请改用TCP。如果您对只知道接收方何时完全丢失/不可用的部分解决方案感到满意,请参阅此处:ICMP "destination unreachable" packet on udp connected socket

一般的想法是,如果connect() UDP套接字然后在其上接收数据,您可以收到ICMP“目标无法访问”错误(您将要使用select()epoll()为了这)。在某些情况下,您会发现您的消息没有传到另一方......但在其他情况下您可能没有,因为嘿,它是UDP。