c - sendto 在发送时没有给出错误

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

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

最佳答案

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

一般的想法是,如果您 connect() 您的 UDP 套接字然后在其上接收数据(您将要使用 select() epoll() )。在某些情况下,您会发现您的消息没有到达另一端……但在其他情况下您可能不会,因为嘿,它是 UDP。

关于c - sendto 在发送时没有给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28059867/

相关文章:

c - 对数组指针排序后释放内存时出错

c - aio_write 在我的简单客户端/服务器程序中不起作用

linux - 创建包含内容的文件,其中内容有新行

linux - TCP sendto (C++) 在 Linux 但不是 OSX 上失败。错误号 : EINVAL 22 Invalid argument

sockets - 作用于 UDP 套接字时,什么会导致 sendto() 发送的字节数少于请求的字节数?

c - C 中的结构和 union ,确定大小和访问成员

代码运行良好但在执行中途随机停止

java - 像这样设置系统 PATH : export PATH=$PATH:/. ./play Linux 上的 Play Framework 失败

c - 如何找到所有子进程?

c - Perf Profiler 报告过度使用 "do_syscall_64"