【发布时间】: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