我在写一个将TCP数据块发送到C服务器的Java TCP客户端。客户端服务器在我的开发PC上运行得非常好。该代码在硬件板上部署后显示丢包。我只有我的日志,我知道服务器没有收到所有的数据包。 我没有硬件来测试。因此,在第一级,我想确保客户端代码确实发送了所有需要的数据。确保TCP客户端和服务器之间没有数据包丢失
这是我的代码(Java中的客户端部分)。我如何确保完成?是否有一些重新发送命令与时间等?
Socket mySocket = new Socket("10.0.0.2",2800);
OutputStream os = mySocket.getOutputStream();
System.out.println(" Sending 8 byte Header Msg with length of following data to Server");
os.write(hdr, 0, 8);
os.flush();
System.out.println(" Sending Data ");
start = 0;
for(int index=0; index < ((rbuffer.length/chucksize)+1); index++){
if(start + chucksize > rbuffer.length) {
System.arraycopy(rbuffer, start, val, 0, rbuffer.length - start);
} else {
System.arraycopy(rbuffer, start, val, 0, chucksize);
}
start += chucksize ;
os.write(val,0,chucksize);
os.flush();
}
这里是C代码段,其接收该数据:
所有的while ((bytes_received = recv(connected, rMsg, sizeof(rMsg),0)) > 0){
if (bytes_received > 0) // zero indicates end of transmission */
{
/* get length of message (2 bytes) */
tmpVal = 0;
tmpVal |= rMsg[idx++];
tmpVal = tmpVal << 8;
tmpVal |= rMsg[idx++];
msg_len = tmpVal;
len = msg_len;
//printf("msg_len = %d\n", len);
printf("length of following message from header message : %d\n", len);
char echoBuffer[RCVBUFSIZE] ;
memset(echoBuffer, 0, RCVBUFSIZE);
int recvMsgsize = 0;
plain=(char *)malloc(len+1);
if (!plain)
{
fprintf(stderr, "Memory error!");
}
for(i = RCVBUFSIZE; i < (len+RCVBUFSIZE); i=i+RCVBUFSIZE){
if(i>=len){
recvMsgSize = recv(connected, echoBuffer, (len - (i-RCVBUFSIZE)), 0);
memcpy(&plain[k], echoBuffer, recvMsgSize);
k = k+recvMsgSize;
}
else{
recvMsgSize = recv(connected, echoBuffer, RCVBUFSIZE, 0);
memcpy(&plain[k], echoBuffer, recvMsgSize);
k = k+recvMsgSize;
}
}
}//closing if
}//closing while
你怎么知道数据包丢失? TCP是一种有保证的交付协议。这意味着如果写入或读取失败,那么将会出现错误。这可能是应用程序中的错误吗? –
这是什么打我。 TCP是一个可靠的协议。我将发布我的C端服务器接收块的片段。这也可能是一个硬件问题。我是Java的noob,只是想确定是否有任何方法来重新发送数据包。当然,内核必须为协议可靠性做这件事......你怎么看它? – user489152
数据包可能会丢弃在I/P层,但TCP会重新发送它们,并按发送顺序传送给接收方。我认为你的服务器或客户端存在一些错误。 –