gpt4 book ai didi

java - 为什么C和Java代码之间的socket通信只收到64K数据?

转载 作者:行者123 更新时间:2023-11-30 15:31:26 25 4
gpt4 key购买 nike

我使用套接字作为 C 程序和 Java 程序之间的桥梁。 C端是服务器socket,接收Java端的数据,处理数据并将结果返回。 Java端是客户端socket,将数据发送到C端进行处理,然后接收C端的结果。

C端代码(服务器):

const int SOCKET_BUF_IN_LEN = 160024;    //socket_buf_in length
const int SOCKET_BUF_OUT_LEN = 5000; //socket_buf_out length

unsigned char socket_buf_in[SOCKET_BUF_IN_LEN];
unsigned char socket_buf_out[SOCKET_BUF_OUT_LEN];
struct AlgSocketIn alg_socket_in;
struct AlgSocketOut alg_socket_out;

//... some socket connection setup code
setsockopt(new_socket_fd, SOL_SOCKET, SO_RCVBUF, &SOCKET_BUF_IN_LEN, sizeof(SOCKET_BUF_IN_LEN));

bytes_recv = recv(new_socket_fd, socket_buf_in, SOCKET_BUF_IN_LEN, 0);

run_alg(); //process the data

bytes_send = send(new_socket_fd, socket_buf_out, SOCKET_BUF_OUT_LEN, 0);

套接字发送缓冲区 socket_buf_in 有 160024 字节,如上所述。我使用 setsockopt() 将套接字缓冲区设置为这个大小。

Java端代码(客户端):

public AlgOutData sendRecvData(AlgInData inData, int portNum) {
AlgOutData outData = new AlgOutData();
Socket sock = new Socket("localhost", portNum);
int sentBytes, recvBytes;
sock.setSendBufferSize(160024);
sentBytes = serializeData(inData, sock); //send data to server
recvBytes = deserializeData(outData, sock); //receive result from server
sock.close();
return outData;
}

private int serializeData(AlgInData inData, Socket socket) throws IOException {
int totalNumSamples = 160024;
DataOutputStream os = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream(), 160024));
for(int i=0; i<totalNumSamples; i++) {
os.writeByte(inData.getSamples()[i]);
}
os.flush();
int numBytes = os.size();
return numBytes;
}

但是当我启动C程序和Java程序并完成从Java端向C端发送字节后,我发现C端仅从TCP套接字流接收到65536字节。我调试了它并通过查看 C 代码中的这一行发现了这一点:

bytes_recv = recv(new_socket_fd, socket_buf_in, SOCKET_BUF_IN_LEN, 0);

完成此调用后,bytes_recv 为 65536 字节,而不是 socket_buf_in 的长度 160024 字节。

但是在Java端,我发现发送的数据确实是160024字节。在 serializeData() 中,该行显示

//....      
os.flush();
int numBytes = os.size();
调用 os.flush() 后,

numBytes 为 160024。

那为什么我在C端只得到65536字节的数据,而Java端却发送了全部160024字节的数据呢?我是否在 C 端正确使用了正确的套接字发送/接收函数?

我还尝试在C端使用以下代码重复接收字节流,直到接收到所有160024字节:

num_bytes = 0;
while (num_bytes < SOCKET_BUF_IN_LEN) {
bytes_recv = recv(new_socket_fd, socket_buf_in, SOCKET_BUF_IN_LEN, 0);
if (bytes_recv < 0)
handle_error("Error on socket recv.\n");
num_bytes += bytes_recv;
}

但这一次,即使 num_bytes 为 160024,套接字缓冲区 socket_buf_in[160024] 的值全为零,这是错误的。

另一方面,当我调试Java端代码时,我发现即使我将输出流对象os设置为具有160024缓冲区大小,它最多只能正确写入20024字节,不是 160024 字节。

对于 160024 字节的套接字通信,C 端或 Java 端代码有什么问题?

最佳答案

最后的循环看起来几乎是正确的,但是当您将数据读入数组时,您需要移动传递给 recv 的指针。否则,每次调用都会覆盖数组的开头。类似的东西

bytes_recv = recv(new_socket_fd, socket_buf_in+num_bytes, SOCKET_BUF_IN_LEN, 0);

关于java - 为什么C和Java代码之间的socket通信只收到64K数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24807170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com