大家好,请会的人帮小弟一下,在这里感激不尽。我用wince C++ 写udp socket 通信。客户端使用udp广播向局域网发送数据,客户端代码已经写好了,这里不贴出来。
服务器端,写的代码是这样的,服务器端随时监听客户端发送来的消息,当收到客户端消息进行判断,如果符合要求,则向客户端发送出指定的字符串。这里我是开个线程做的,但是存在问题,程序运行起来,程序就在while循环内,不停的执行了,这样很浪费资源的。我想做的是,程序处于监听模式(阻塞状态),当程序只有当接收到客户端发送来的消息时,只执行接收数据和发送数据的功能。请各位大哥帮忙了。小弟谢谢了。
提示:小弟找了,C# 里udpclient udpclient = new udpclient("端口号");可以解决这个问题,它默认的处于监听状态,只有消息来的时候才执行while内的代码。 
SOCKET socketSrv;
int startTimes = 1;
HANDLE hAccepetThread;
SOCKET socketConn;
SOCKADDR_IN localAddr;
int lengthSize = sizeof(SOCKADDR);
void CSendDataToServer::InitRecvSocket()
{
int nPort=10801;//远程端口
WSADATA wsaData;
WORD wVersionRequested=MAKEWORD(1,1);
int err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
{
return ;
}
if (LOBYTE(wsaData.wVersion) !=1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
socketSrv=socket(AF_INET,SOCK_STREAM,0);
if(socketSrv==INVALID_SOCKET)
{
return;
}
ZeroMemory(&localAddr,sizeof(localAddr));
        localAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
localAddr.sin_family=AF_INET;
     localAddr.sin_port=htons(nPort);
if(bind(socketSrv,(SOCKADDR*)&localAddr,sizeof(SOCKADDR))==SOCKET_ERROR)
{
WSAGetLastError();
}
//waiting to receive data
       hAccepetThread = CreateThread(NULL,0,ThreadFuncAcceptData,NULL,0,NULL);//处理阻塞,开线程
       CloseHandle(hAccepetThread);
}
  
DWORD CSendDataToServer:: ThreadFuncAcceptData(LPVOID pParam)   
{  
SOCKADDR_IN tmpAddr;
tmpAddr.sin_family=AF_INET;             
        tmpAddr.sin_port = htons(10801);
tmpAddr.sin_addr.s_addr =INADDR_ANY;
        int tmpRecvLen = sizeof(tmpAddr);
char recvBuf[100];
CSendDataToServer *pSendDataToServer = (CSendDataToServer*)pParam; 
        fd_set fdRead;
int ret;
FD_ZERO(&fdRead);

while (TRUE)
{
    ret = select(0,&fdRead,NULL,NULL,NULL);//关键是这里,怎么不进入阻塞状态呢?
    if (ret > 0)
{
if (FD_ISSET(socketSrv,&fdRead))
{
ZeroMemory(recvBuf,sizeof(recvBuf));
recvfrom(socketSrv,recvBuf,sizeof(recvBuf),0,(SOCKADDR*)&tmpAddr,&tmpRecvLen);
if (recvBuf[0] == 'q')
{
    sendto(socketSrv,"q",strlen("q"),0,(SOCKADDR*)&tmpAddr,tmpRecvLen);
    RETAILMSG(1,(L"Vd1100====== send to zcdc finish======:%s\n",recvBuf));
}
else
{
RETAILMSG(1,(L"Recv Data is  not Vd1100 data  ======"));
}
}
   }
     closesocket(socketSrv);
     WSACleanup();
}
    return 1;
}

解决方案 »

  1.   

    仔细检查你的代码
     //waiting to receive data
           hAccepetThread = CreateThread(NULL,0,ThreadFuncAcceptData,NULL,0,NULL);//处理阻塞,开线程
           CloseHandle(hAccepetThread);
    CreateThread 貌似写错了吧。
    写代码当心点啊。
      

  2.   

    ret = select(0,&fdRead,NULL,NULL,NULL);//关键是这里,怎么不进入阻塞状态呢?
    这里要进行一下判断,如果fdRead为空的话,就是一个都没有连上来,就不要进行循环
    Windows下面如果fdRead为空,会直接返回的