您好我已经编程的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]);