我想在一个线程中监控UDP端口,用于接收另一个程序发出的远程命令,当接到相应的指令是就发送消息WM_MYMSG给窗口,窗口执行相应的操作。但是我就无法收到那个消息,请各位高手指点一二,不胜感激。
监控UDP端口的线程:
UINT _UDPThread(LPVOID lparam) //UDP接受信息线程开始
{ CCSSAppTestDlg *pDlg=(CCSSAppTestDlg *)lparam;

CSocket sockSrvrUdp;
UINT LPort,LEerror;
LPort=pDlg->m_localport;
int ret=0;
ret=sockSrvrUdp.Create(LPort,SOCK_DGRAM);
if(ret==0)
pDlg->m_lbEvents.AddString("SOCKET_ERROR");
LEerror=GetLastError();
char buff[100]={0};
CString ipStr;
CString msg;
UINT port;
for(;;)
{
ret=sockSrvrUdp.ReceiveFrom(buff,100,ipStr,port);//IP和port均为返回值

if(buff[0]=='D') return 0;
if(ret==SOCKET_ERROR) 
{
pDlg->m_lbEvents.AddString("SOCKET_ERROR");
break;
}
msg.Format(buff);
CString Strtemp;
      if (msg符合条件)
{
                     PostMessage((HWND)lparam,WM_MYMSG,0,0);
                    }
}
收到自定义消息时做相应的处理:
LRESULT CCSSAppTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
{
case WM_MYMSG:
        m_lbEvents.AddString("收到自定义的消息");
break;
        }
}

解决方案 »

  1.   

    执行线程的语句为:        pThreadLisen=::AfxBeginThread(_UDPThread,this); //开始UDP线程问:为什么收不到自定义消息?
      

  2.   

    用WSAAsyncSelect模型。
    int WSAAsyncSelect(
        SOCKET s,
        HWND hWnd,
        unsigned int wMsg,
        long lEvent
    )将套接字和窗口消息关联起来,这种处理更方便。
      

  3.   

    flyelf(空谷清音)的方法是行的,现在可以收到消息了。但是我想我那种做法不是很方便的,ForTopLevel(Beahead) 说的办法很好,能提供一个例子吗?我以前不是用VC编程。
      

  4.   

    (HWND)lparam 这里错误了,试试pThreadLisen=::AfxBeginThread(_UDPThread,this->GetSafeHWnd());
      

  5.   

    或者PostMessage(pDlg->GetSafeHWnd(),WM_MYMSG,0,0);