问题:
主线程里创建套接字
m_Galobalsock=socket(AF_INET,SOCK_STREAM,0);
sockaddr_in server;//服务端套接字
server.sin_family=AF_INET;
server.sin_addr.S_un.S_addr= inet_addr(dlg.m_ip);
server.sin_port=htons((unsigned short)dlg.m_port);
connect(m_Galobalsock,(struct sockaddr* )&server,sizeof(sockaddr_in))!=0)
setsockopt(m_Galobalsock,SOL_SOCKET,SO_RCVTIMEO,(const char*)&timeout,sizeof(timeout))//设置接收超时
子线程接收代码段:
while(flag)
{
  recv(m_Galobalsock,(char*)pdata3,length,0);
  sleep(1000);
}
这个循环一直在执行,知道程序终止
主线程消息响应函数里面的接收代码段:
SuspendThread(pMainwnd->hReadHandle);
recv(m_Galobalsock,(char*)pdata,length,0);
recv(m_Galobalsock,(char*)pdata1,length,0);
ResumeThread(pMainwnd->hReadHandle);现在问题是本来应该是主线程接收到pdata的数据被子线程的循环给接收去了.
而pdata1这段数据可以正常接收.请问高手是不是我设置了接收超时的原因吗?
是不是我需要将m_Galobalsock设置为非阻塞模式,可是那样我还能不能设置接收超时.本人初学.望得到指点.谢谢!
 

解决方案 »

  1.   

    不要多次recv吧,不好控制到底是那个接收到想要接受的,recv一次,将接受到的数据发送到主线程进行处理.
      

  2.   

    我也在学习中哈,不过看了你的问题我觉得有2点要注意:
    1,我觉得你的socket应该设置为非阻塞模式,阻塞模式才容易阻碍超时消息的接收。
    2,我最近看了下socket,在调用recv()之前,一般都会定义一组文件描述符fd_set,讲socket加入进去,再用select看,该接收缓冲区是否改变(感觉像线程一样,要等信号量),若改变就调用recv来接收。
      

  3.   

    你的主线程里面没有接收语句,怎么会在主线程里面体现出来呢。你的子线程里面的是WHILE(1),当然是在这里面不断的循环读取数据了