在GPRS模块中使用UDP协议,如果GPRS在线,该UDP数据通道是连接着的,如果某一模块不在线,在UDP服务器端发数据时收到的是多个0X00;但如果我用按键相应函数
void CTestgprsdllView::OnNumonline() 
{
// TODO: Add your command handler code here
int m=0;

  m=get_online_user_amount();
CString str;
str.Format("number=%d",m);
AfxMessageBox(str);
}
get_online_user_amount();是自己动态库里面的函数
int  get_online_user_amount()
{
int num=connectnum;isdisconnect=true;
 // ZeroMemory(recdata,1024);
for(int i=0;i<num;i++)
{
do_send_userdata("ceshi",my_rec[i]);
  Sleep(10);
 
}
Sleep(2000);
        return gprs_online_num ;
}
      如果对方收到“ceshi"马上返回数据”“ok”。在我得接收线程中gprs_online_num 是自定义动态库中的全局变量
           if(strcmp(recdata,"ok")==0)
  {gprs_online_num++;   
  char str[1024];
  sprintf(str,"%d  zaixian| ",gprs_online_num );
  MessageBox(0,str,MB_OK,NULL);
            return 0;}
当我UDP客户端连接此服务端时,我按下void CTestgprsdllView::OnNumonline() 
进行测试在线UDP客户端数目,结果返回
num=0; 1 zaixian;
再次按下该键:num=1,说明我得程序接收线程已经收到“ok”,但接收线程中改变的gprs_online_num 值无法传给get_online_user_amount(),即使延时再长,接收线程的数据无法给当前主线程;高手给点提示吧!

解决方案 »

  1.   

    我得接收线程是:
    int  startrec(LPVOID point) 
    {
    point=m_point;
     hthread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE )recthread,(LPVOID)point,0,NULL); 
    return 0;
    }UINT recthread(LPVOID param)
    {sockaddr_in from;
    int fromlength=sizeof(SOCKADDR);
        //ZeroMemory( recdata,1024);
    ZeroMemory(  recdata,1024);
      reclen=recvfrom(s,recdata,1024,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
      Sleep(1);
      if(strcmp(recdata,"isonline")==0)
      {gprs_online_num++;
      
      char str[1024];
      sprintf(str,"%d  zaixian| ",gprs_online_num );
      MessageBox(0,str,MB_OK,NULL);return 0;}//获得当前在线数目
    }上面所有的是在动态库里面编写的函数,请给分析分析吧,谢谢啦
      

  2.   

    上面的if(strcmp(recdata,"isonline")==0)
      {gprs_online_num++;
      
    写错了错误,为if(strcmp(recdata,"ok")==0)
      

  3.   

    接受到了给主线程发消息,通知用户加1PostThreadMessage一般用tcp好处理阿。