微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

发送带有二进制null\'\\\\ 0\'的字符串

如何解决发送带有二进制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,8);
和发送缓冲区的代码
if (sendto(sock,buf,sizeof buf,(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,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,8);
    if (bind(sock,sizeof(struct sockaddr)) == -1){
        perror(\"Bind\");
        exit(1);
    }
    addr_len = sizeof(struct sockaddr);

                            diep(\"sendto()\");
并接收缓冲区(在大循环中):
bytes_read = recvfrom(sock,sizeof (buf),(struct sockaddr *)&client_addr,&addr_len);
有谁知道我为什么没有收到全部缓冲区?     

解决方法

        通过查看注释,错误很可能是您将接收到的缓冲区视为字符串。 如果要打印/输出缓冲区,则需要先将空字符转换为其他字符。     ,        您应该使用for循环来打印收到的缓冲区,而不是printf:
 for (int i=0; i<bytes_read; i++)
     printf(\"%c\",buf[i]);
    ,        这是不正确的(格式已更改,因此适合我的屏幕):
if (sendto(sock,buf,sizeof buf,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))==-1)
您想要
sizeof(server_addr)
作为长度。这将大于
sizeof(struct sockaddr)
。 另外,从联机帮助页: 返回值 成功调用后,这些调用将返回发送的字符数。如果出错,则返回-1,并正确设置errno。 您尚未考虑返回小于ѭ11的值的情况。不确定如何发生,但似乎需要处理。 我对整体方法的评论类似于@jgauffin所说的。
buf
只是字节。 C13ѭ终止它们只是C字符串的约定,不是必需的。通常,在使用二进制字节缓冲区时,您还会跟踪大小。您只是假设将使用所有的
sizeof(buf)
,但这没有任何意义。 (建议:也许您的ѭ15净荷的一部分应该包括随后的消息大小?)     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。