现在要在程序里加入数据接收完毕的标志,程序如下,我该怎么判断一次性发了多包数据,数据已接收完毕
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);
}
}
}
发送程序是一次发送多行数据(多少数据无法确定,同时也可能有多个发送程序同时向接收程序发送),接收程序是一行一行进行接收,分多次接收完毕,如何判断多行数据已接收完毕,同时向发送程序发送接收完成的标志。
1.如果有多个客户端连接,那你的服务端也应该是多个socket对象来建立连接,你应该给每个对象一个单独的线程来接收数据,而不是全部使用同一个线程
2.如果约定的通信协议里并没有数据长度,也没有规定好超时时间,而是随时可以发送数据,那你只能判断连接什么时候断开就算是发完了,只要没断开永远判断不了对方是否发完了
发送和接收之间需要自定义协议。如发送10帧,每个帧都有帧序号09,每个帧都含有总的帧数量和当前帧序号。发送按照09的帧序号发送,如果收到0~9的帧序号,说明接收完成。
如果发送和接收之间有定专门的协议,可以通过报文头尾标识符以及长度来判断是否接收了一个完整的报文,然后立即退出;
如果只有透传的,则可以定一个超时时间,超过这个时间就退出;