java - 如何将 tcp 套接字上的 java byte[] 发送到服务器上的 c++ char[]?

标签 java c++ sockets arrays

我想从 Java 客户端发送一个 byte[] 数组到服务器,服务器接收 C++ 中的数据。字节数组包含转换为字节的字符和整数(它是一个波头)。服务器未正确接收值。如何发送 byte[] 以便服务器套接字可以将其写入 char[]?我正在使用以下代码:

客户端.java:

//Some example values in byte[]
byte[] bA = new byte[44];
bA[0]='R';
...
bA[4]=(byte)(2048 & 0xff);
...
bA[16] = 16;
....

//Write byte[] on socket
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(bA,0,44);

服务器.cpp

int k = 0,n = 0;
char buffer[100];
ofstream wav("out.wav", ios::out | ios::binary);
while(k<44){//receive 44 values
    memset(buffer ,0 , 100);
    n = recv(sock , buffer , 100 , 0);
    k += n;
    buffer[99] = '\0';
    wav.write(buffer,n);
}

最佳答案

我看到的一个问题是,如果您收到 100 个字符,您将使用此行破坏数据:

buffer[99] = '\0';

如果该位置有 NULL 以外的字符,则数据已损坏。由于数据是二进制的,因此不需要 null 终止 buffer。从循环中删除该行。

相反,依靠 recv 的返回值来确定要复制到流中的字符数。这引出了另一点——您没有检查 recv 是否返回错误。

关于java - 如何将 tcp 套接字上的 java byte[] 发送到服务器上的 c++ char[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24022769/

相关文章:

java - 销毁线程是否会销毁线程内的套接字?

java - 检查两个列表是否包含相同对象的最快方法

java - 从枚举返回字符串

c++ - dll 注入(inject)失败

c++ - 在现代 C++ 之前,有选择地执行不使用 constexpr if 的代码

javascript - 发送到套接字 IO socket.id

java - 仅渲染 JTable 模型的一部分

java - 如何显示我的搜索结果?

NetBSD '::system' 上的 C++ 编译错误尚未声明

c# - 套接字关闭 : when should I use SocketShutdown. 两者