发送带有二进制null\'\\\\ 0\'的字符串
|
嗨,我已经编程了Linux守护进程,该守护进程以udp数据包的形式发送文件。
问题是在字符串ѭ0中,它仅发送
abc
非空字符和asdf
(空符号后的所有字符),
有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)
在服务器端,我需要接收二进制缓冲区:
定义套接字代码:
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);
有谁知道我为什么没有收到全部缓冲区?
没有找到相关结果
已邀请:
3 个回复
骂陋冠
碧肮械淌设
枫湃揩乾纲
您想要
作为长度。这将大于
。 另外,从联机帮助页: 返回值 成功调用后,这些调用将返回发送的字符数。如果出错,则返回-1,并正确设置errno。 您尚未考虑返回小于ѭ11的值的情况。不确定如何发生,但似乎需要处理。 我对整体方法的评论类似于@jgauffin所说的。
只是字节。 C13ѭ终止它们只是C字符串的约定,不是必需的。通常,在使用二进制字节缓冲区时,您还会跟踪大小。您只是假设将使用所有的
,但这没有任何意义。 (建议:也许您的ѭ15净荷的一部分应该包括随后的消息大小?)