确保TCP客户端和服务器之间没有丢包

use*_*152 3 c java packets tcpclient

我正在编写一个Java TCP客户端,它将数据块发送到C服务器.客户端 - 服务器在我的开发PC上运行良好.在硬件板上部署时,此代码显示数据包丢失.我只有我的日志,我知道服务器没有收到所有数据包.我没有要测试的硬件.因此,在第一级,我想非常确定客户端代码确实发送了所有必需的数据.

这是我的代码(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();
        }
Run Code Online (Sandbox Code Playgroud)

以下是接收此数据的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
Run Code Online (Sandbox Code Playgroud)

Tom*_*icz 5

首先,没有TCP/IP中的丢包.该协议旨在以正确的顺序可靠地发送字节流.所以问题必须在你的应用程序或另一方.

我不是真正的心情来分析这整个arraycopy()疯狂(C的人?),但你为什么不只是发送整个rbuffer在一个经历BufferedOutputStream

OutputStream os = new BufferedOutputStream(mySocket.getOutputStream());
Run Code Online (Sandbox Code Playgroud)

然后:

os.write(rbuffer);
Run Code Online (Sandbox Code Playgroud)

相信我,BufferedOutputStream正在做同样的事情(将字节收集到块中并一次发送).或许我错过了什么?

  • @ user489152,要记住的一件事是Java是big-endian而C具有处理器的字节序,所以如果你发送一个由Java原语构建的字节流,你可能需要反转C上的字节顺序侧. (2认同)