套接字接收错误的数据

时间:2013-09-12 12:31:36

标签: 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);

知道为什么会这样吗?

提前致谢....

1 个答案:

答案 0 :(得分:4)

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

你看到的问题(“垃圾”)是因为第一个问题。 printf只会从buf中获取字符,直到它到达字符串终结符'\0'。如果找不到,那么printf将继续,甚至从缓冲区中读取字符。

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

buf[rd] = '\0';