0

我有用 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);

知道为什么会这样吗?

提前致谢....

4

1 回答 1

6

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

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

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

buf[rd] = '\0';
于 2013-09-12T12:36:19.417 回答