c++ - 套接字接收错误数据

标签 c++ c sockets

我的服务器是用 C/C++ 编写的,客户端是在 Android 上运行的 Java。

服务器看起来像

C++ 服务器

#define ETH_DATA_LENGTH 25

 bzero(buf,ETH_DATA_LENGTH);
 rd=read(newsockfd,buf,ETH_DATA_LENGTH);

      if(rd>0){
       printf("received %s\n", buf);
       char cmd[ETH_DATA_LENGTH]={0};
       sprintf(cmd,"%s",buf);
       //setCommand(cmd);
       } 

Android 客户端发送格式为5_11_14_, 5_11_15_, 5_11_16_,etc... 的数据包,如果客户端在每个数据包中存在延迟,则服务器会正​​确接收数据。但是当客户端不断发送时,我得到了一些额外的字符,看起来像

received 5_11_9_

received 5_11_10_
5_11_11_
5_11_12�ڳ
received _

received 5_11_13_

在 android 端,我发送的数据是这样的

Java 客户端

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientsocket.getOutputStream())),true);
out.println(str);

知道为什么会这样吗?

提前致谢....

最佳答案

一些事情:您收到的数据不是以零结尾,换句话说,您不能将其用作字符串。另一个是当你要求读取25个字节时,它最多可以读取25个字节或更少。您需要有某种记录分隔符,或者事先发送长度。

您看到的问题(“垃圾”)是第一个问题。 printf 将简单地从 buf 中获取字符,直到它遇到字符串终止符 '\0'。如果没有找到,那么 printf 将继续,甚至从超出缓冲区的地方读取字符。

对此的简单解决方案是将缓冲区大小增加一(以适应终止符),接收比缓冲区大小少一个字节(例如 sizeof(buf) - 1),然后成功的 read 调用终止输入:

buf[rd] = '\0';

关于c++ - 套接字接收错误数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18764356/

相关文章:

java - Apache HTTPClient 抛出 java.net.SocketException : Connection reset for many domains

c - 演示长整数的字节顺序

c - 指针在 if/else 语句之前有地址,但立即更改为 0x0

java - 如何通过发送和接收数据包手动获取网站的 IP 地址抛出 Google DNS、OpenDNS...

python-3.x - Python Socket 函数错误,找不到 socket.gethostbyname

c - 使用类函数宏测量 C 中函数调用的执行时间

c++ - 为对象实现二维数组

c++ - 如何在不知道名称的情况下访问结构体成员?

c++ - ->(指向成员)运算符的作用是什么?

c++ - 在运行时加载的 dll/so 中 atexit() 的行为是什么?