我的服务器是用 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/