18,356
社区成员
发帖
与我相关
我的任务
分享
while(1)
{
FD_ZERO(&recvSet);
FD_SET(stcp1,&recvSet);
FD_SET(stcp2,&recvSet);
ret=select(0,&recvSet,NULL,NULL,&tv) ;
if(stcp1,&recvSet)
{
//如果stcp1有数据需要读入,将数据存入链表
}
if(stcp2,&recvSet)
{
//如果stcp2有数据需要读入,将数据存入链表
}
}
while(1)
{
FD_ZERO(&recvSet);
FD_SET(stcp1,&recvSet);
FD_SET(stcp2,&recvSet);
ret=select(0,&recvSet,NULL,NULL,&tv) ;
if(FD_ISSET(stcp1,&recvSet))
{
//如果stcp1有数据需要读入,将数据存入链表
}
if(FD_ISSET(stcp2,&recvSet))
{
//如果stcp2有数据需要读入,将数据存入链表
}
}
UINT StoreToList1(LPVOID pParam)
{
UINT i;
UINT j;
int cnt;
UINT recvTime1;
UINT recvChannel1;
UINT recvDatalen1;
int precvbuf1[16384*4];
while(1)
{
WaitForSingleObject(EventStoreToList1, INFINITE); //等待EventStore有信号
//接收时间
i = 0;
while( i < 8)
{
cnt = recv( stcpactive[MonitorOfIP[0]], (char*)&recvTime1+i, 8-i, 0 );
if( cnt <=0)
{
AfxMessageBox("recv failed5");
}
i += cnt;
//创建链表
pNewData1=new RecvData;//链表新节点
if( i == 8)
{
pNewData1->recvtime = recvTime1;//将接收到的时间放入链表
}
}
//接收通道号
i = 0;
while( i < 4)
{
cnt = recv( stcpactive[MonitorOfIP[0]], (char*)&recvChannel1+i, 4-i, 0 );
if( cnt <=0)
{
AfxMessageBox("recv failed6");
}
i += cnt;
if( i == 4)
{
pNewData1->channelID = recvChannel1;//将接收到的通道号放入链表
}
}
//接收数据长度
i = 0;
while( i < 4)
{
cnt = recv( stcpactive[MonitorOfIP[0]], (char*)&recvDatalen1+i, 4-i, 0 );
if( cnt <=0)
{
AfxMessageBox("recv failed7");
}
i += cnt;
if( i == 4)
{
pNewData1->recvdatalen = recvDatalen1;//将接收到的数据长度放入链表
}
}
//接收数据
i = 0;
while( i < recvDatalen1*4)
{
cnt = recv( stcpactive[MonitorOfIP[0]], (char*)precvbuf1+i, recvDatalen1*4-i, 0 );
if( cnt <=0)
{
AfxMessageBox("recv failed8");
}
i += cnt;
}
if( i == recvDatalen1*4)
{
for( j=0; j<recvDatalen1*4; j++)
{
*(pNewData1->recvbuffer+j) = *(precvbuf1+j);
}
}
//链表后续处理
if(phead1==NULL)//若为首节点
{
phead1=pNewData1;
pEnd1=pNewData1;
}
else//若不为首节点
{
pEnd1->next=pNewData1;
pEnd1=pNewData1;
}
EventStoreMonitor1.SetEvent();//设置 EventStore有信号
}
return 0;
}
UINT Recvdata(LPVOID pParam)
{
//开始接接收数据
while(1)
{
//select 操作
FD_ZERO(&recvSet);
for(i=0;i<2;i++)
{
FD_SET(stcpactive[i],&recvSet);
}
ret=select(0,&recvSet,NULL,NULL,&tv);//等待100ms
//case 1:select error
if(ret==SOCKET_ERROR)
{
::AfxMessageBox ("select error");
goto leave;
}
//case 2:select timeout
if(ret==0)
{
goto leave;
}
//case 3:select
for(int m=0;m<2;m++)
{
//判断是1#监测仪
if(FD_ISSET(stcpactive[m],&recvSet))//如果1#监测仪有信号
{
MonitorOfIP[0]=m;
EventStoreToList1.SetEvent();//启动保存至链表线程
}
}
//判断是2监测仪
if(FD_ISSET(stcpactive[m],&recvSet))
{
MonitorOfIP[1]=m;
EventStoreToList2.SetEvent
}
}
}
}
leave:
// We only get here on an error - close the sockets
if( stcp >= 0 )
{
closesocket(stcp);
}
WSACleanup();
goto TrgRecvRestart;
return 0;
}