Mr·GE 2023-03-23 14:16 采纳率: 53.1%
浏览 26
已结题

TCP/IP 如何判断多包数据已收完

现在要在程序里加入数据接收完毕的标志,程序如下,我该怎么判断一次性发了多包数据,数据已接收完毕

while (1)
{

    bytesRead = ServerTCPRead (clientInfoPtr->handle, dataBuf, sizeof (dataBuf) - 1, 2000);  
   
    GetTCPPeerAddr (clientInfoPtr->handle, peerAddress, sizeof (peerAddress)); 
    
    if (bytesRead > 0)
    {
        
        dataBuf [bytesRead] = '\0';
        
        GetTCPPeerName (clientInfoPtr->handle, peerName, sizeof (peerName));

        GetSystemDate (&month, &day, &year);
        GetSystemTime (&hour,&minute,&second);
        sprintf(datetime,"%4d%02d%02d%02d%02d%02d",year,month,day,hour,minute,second);

        if (strcmp(peerAddress,"192.168.1.157")==0)
        {
            char readData[5001];
            CmtGetLock(lock);
            memcpy(readData,dataBuf,5001);
            CmtReleaseLock(lock);
            NBearingInfo     *nbearingInfo=readData;

           sprintf(sqlcommand,"insert into  nbearinginfo values('%.4f','%.4f','%s','%s','%s','%s','%s','%s','%s','%s','%s')",nbearingInfo->setvalue,nbearingInfo->value,nbearingInfo->angle,nbearingInfo->spe,nbearingInfo->date,nbearingInfo->test,nbearingInfo->type,nbearingInfo->number,nbearingInfo->codename,nbearingInfo->name,datetime); //获取实时数据显示并存入数据库中
           
           mysql_real_query(&conn,sqlcommand,strlen(sqlcommand));
            int i=0;
            GetNumTableRows (TabPanelHandlern, NPANEL_TABLE,&i );
            if(i>=10)
            DeleteTableRows (TabPanelHandlern, NPANEL_TABLE,i,1);
            
            InsertTableRows (TabPanelHandlern, NPANEL_TABLE,1 , 1, VAL_USE_MASTER_CELL_TYPE);
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(1,1),nbearingInfo->setvalue);
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(2,1),nbearingInfo->value);
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(3,1),nbearingInfo->angle); 
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(4,1),nbearingInfo->spe); 
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(5,1),nbearingInfo->date);
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(6,1),nbearingInfo->test);
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(7,1),nbearingInfo->type);
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(8,1),nbearingInfo->number);
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(9,1),nbearingInfo->codename);
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(10,1),nbearingInfo->name);
            SetTableCellVal (TabPanelHandlern, NPANEL_TABLE,MakePoint(11,1),datetime); 
        } 
    }
}

发送程序是一次发送多行数据(多少数据无法确定,同时也可能有多个发送程序同时向接收程序发送),接收程序是一行一行进行接收,分多次接收完毕,如何判断多行数据已接收完毕,同时向发送程序发送接收完成的标志。

  • 写回答

4条回答 默认 最新

  • 於黾 2023-03-23 14:19
    关注

    1.如果有多个客户端连接,那你的服务端也应该是多个socket对象来建立连接,你应该给每个对象一个单独的线程来接收数据,而不是全部使用同一个线程
    2.如果约定的通信协议里并没有数据长度,也没有规定好超时时间,而是随时可以发送数据,那你只能判断连接什么时候断开就算是发完了,只要没断开永远判断不了对方是否发完了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月1日
  • 已采纳回答 3月24日
  • 创建了问题 3月23日

悬赏问题

  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果