【问题标题】:Why socket just dumped between Android and Linux?为什么套接字只是在 Android 和 Linux 之间转储?
【发布时间】:2021-04-14 02:48:23
【问题描述】:

在我的情况下,Android App 应该被视为一个服务器,而 linux 是客户端。 我只是将数据从 linux 发送到 Android,每次发送 4096 字节。 日志显示linux发送所有数据成功。

来到服务器,即Android... 服务器接收数据,每次接收 4096 字节。但是由于 read(...) 函数返回值 -1,所以发生了套接字错误;

这是我的代码:

在带有 c++ 的 linux 中:

auto size = static_cast<int>(buffer.size()); // buffer is the data needed to send;
auto bytes_send = 0, bytes = 0;
printf("target. data size needed to send: %d\n", size);

int single = 4096;
while(bytes_send < size){
    int remain = size - bytes_send;
    if(remain < single){
      bytes = send(socket_client_fd, &buffer[bytes_send], remain, 0);
    } else {
      bytes = send(socket_client_fd, &buffer[bytes_send], single, 0);
    }

    if(bytes < 0){
      std::cerr:: "Failed to send data" << std::endl;
      return;
    } 
    bytes_send += bytes;
    printf("This remain: %d; We send %d bytes; Totally %d bytes sended;\n", remain, bytes, bytes_send);

}

以及带有java的服务器:

   // previously got size need to receive
   byte[] bytes = new byte[size];
   int bytes_recved = 0;
   int single = 4096;
   while(bytes_recved < size){
       int remain = size - bytes_recved;
       int read = -1;
       if(remain < single)
         read = inputStream.read(bytes, bytes_recved , remain);
       else 
         read = inputStream.read(bytes, bytes_recved , single);
       if(read < 0){
         Log.i(TAG, "received failed, less than 0 bytes " + read);
         break;
       }

       bytes_recved += read;
       Log.i(TAG, "received: " + bytes_recved + " ; receive this time: " + read);
   }

Client发送完所有数据,但是Server收不到数据,这里是Server(Android)的日志,好像数据刚刚丢失!我认为我的代码是正确的,但为什么它失败了?

这是服务器的日志: The log of Server(Android)

【问题讨论】:

  • 我认为您没有使用读取的off(偏移量)参数。你称之为readed。这是bytes 数组的偏移量。
  • 对不起,我只是忘了把那个变量改成“bytes_recved”,我想现在我重新编辑后是正确的。
  • 顺便说一句,您可以通过以下方式摆脱 Java 代码中的 if 语句:remain = single
  • Java 命名约定对变量和方法使用驼峰命名法,不带下划线。您正在使用 c 命名约定。
  • @Tarik 哦!太好了,谢谢你的建议。但是我仍然想知道在Android中读取套接字缓冲区时丢失的部分数据。

标签: java android c++ linux sockets


【解决方案1】:

逻辑错误是这样的:

if(readed < 0)

应该是:

if(read < 0)

我建议您使用更好的变量名。 read 的过去分词是 read 而不是 readed

【讨论】:

  • 对不起,这是我的错,我只是在发布这个问题时犯了一个错误。我会重新编辑这个问题
  • 你能解释一下这个“错误”是怎么发生的吗?您的计算机中是否有某种错误破坏了剪切/粘贴操作?
  • @SamVarshavchik 不知道你在说什么。
  • @SamVarshavchik 发生“错误”是因为我在发布此问题时将示例代码写入该网站。现在在代码列表中是c++ if(read &lt; 0 ),在重新编辑之前它是c++ if(readed &lt; 0)
  • 为什么要“编写示例代码”而不是简单地剪切/粘贴有问题的确切代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2017-08-07
  • 1970-01-01
  • 2022-07-18
  • 1970-01-01
相关资源
最近更新 更多