用二进制发送stringnull'\ 0'

您好我已经编程的Linux守护进程谁发送udp数据包中的文件。 问题是在string"abc\0asdf"它只发送abc not null字符和asdf (null符号后的所有字符),

有udp客户端代码,哪些发送数据包:

 int sock; struct sockaddr_in server_addr; struct hostent *host; host= (struct hostent *) gethostbyname((char *)ip); if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1){ perror("socket"); exit(1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr = *((struct in_addr *)host->h_addr); memset(server_addr.sin_zero,0,8); 

和发送缓冲区的代码:

 if (sendto(sock, buf, sizeof buf, 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))==-1) 

在serverside我需要接收二进制缓冲区:

定义套接字代码:

 int sock; int addr_len, bytes_read; struct sockaddr_in server_addr , client_addr; if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("Socket"); exit(1); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = INADDR_ANY; //bzero(&(server_addr.sin_zero),8); memset(server_addr.sin_zero,0,8); if (bind(sock,(struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1){ perror("Bind"); exit(1); } addr_len = sizeof(struct sockaddr); diep("sendto()"); 

并接收缓冲区(大循环):

 bytes_read = recvfrom(sock,buf,sizeof (buf),0, (struct sockaddr *)&client_addr, &addr_len); 

有谁知道为什么我没有收到完整的缓冲区?

通过查看注释,错误很可能是您将接收的缓冲区视为字符串。

如果要打印/输出缓冲区,则需要先将空字符转换为其他字符。

这是不正确的(格式改变,所以适合在我的屏幕上):

 if (sendto(sock, buf, sizeof buf, 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))==-1) 

你需要sizeof(server_addr)作为长度。 这将比sizeof(struct sockaddr)

另外,从手册:

返回值成功时,这些调用返回发送的字符数。 出错时,返回-1,并适当地设置errno。

你没有考虑到返回小于sizeof(buf)值的情况。 不知道如何发生,但似乎是要处理的事情。

我对整体方法的评论与@jgauffin所说的相似。 buf只是字节。 这只是C字符串的约定, '\0'终止它们,而不是要求。 通常在使用二进制字节缓冲区时,您还要跟踪大小。 你只是假设所有的sizeof(buf)将被使用,这是没有意义的。 (建议:也许你sendto有效载荷的一部分应该包括sendto的消息的大小?)

您应该使用for循环来打印您接收到的缓冲区而不是printf:

  for (int i=0; i<bytes_read; i++) printf("%c",buf[i]);