我的程序代码如下:
但是编译的时候OnCreate函数里的WSAAsyncSelect运行之后,不能马上调用WM_SOCK1的OnSock函数,我在.cpp文件前面加上了消息映射:ON_MESSAGE(WM_SOCK1,OnSock1)
在类的头文件中也声明了消息:
#define WM_SOCK1          WM_USER+203
#define         WM_SOCKREAD      WM_USER+204希望大家帮忙分析一下,急用,谢谢了!int CDTSockCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
lines=0;
GetSystemTime(&t1);
WSADATA d;
WSAStartup(MAKEWORD(2,2),&d);
sd=socket(AF_INET,SOCK_DGRAM,0);
addr.sin_family=AF_INET;
addr.sin_port=htons(1234);
addr.sin_addr.s_addr=inet_addr("192.168.1.1");
int r=bind(sd,(sockaddr*)&addr,sizeof(sockaddr));
r=1;
         r=WSAAsyncSelect(sd,m_hWnd,WM_SOCK1,FD_READ);
         
         运行完这一步就直接跳到return了,没有执行OnSock,是不是前面某一块没有成功,但是我都是从另一个程序上拷贝下来的,那个程序好使啊。大家帮我看看!谢谢!        
return 0;
}int CDTSockCtrl::OnSock1(WPARAM wParam, LPARAM lParam)
{
int num,len,i;
char *pt;
WORD t;
len=sizeof(add_from);
num=recvfrom(sd,(char*)Recvpb,1024*8,0,&add_from,&len);
pt=(char*)Recvpb;
//////////////////////////////////////////////////////////////////////////

if(pt<(char*)Recvpb+num-102)
{
m_numperb=*(pt+4);//
                  m_bperbag=*(pt+5);//
m_nofbag=*(pt+6);//
m_maxnofbag=0;
if(m_nofbag==0)
{
lines++;
for(i=0;i<m_bperbag;i++)
{
CopyMemory(Recvpl+i*m_numperb,pt+8+i*m_numperb*2,m_numperb*2);// }
}
if(counter%20==0)
{
Invalidate();
}

else if(counter==1024)
{
counter=0;
}
else
counter++;
}

//////////////////////////////////////////////////////////////////////////
FireRecvEv((long*)Recvpl);
return 0;
}

解决方案 »

  1.   

    你好像还没有进行读吧。
    WSAAsyncSelect是用来进行消息绑定的。由最后一个参数指定需要响应的事件。只有发生这些事件时,才能发送指定的消息。你这里指定FR_READ。但并没有看到读啊。
      

  2.   

    int CDTSockCtrl::OnSock1(WPARAM wParam, LPARAM lParam) 中
    switch(LOWORD(lParam))
    {
    case FD_READ:
    ......(你的那堆代码)
      

  3.   

    只有FD_READ有数据要读的时候,才会响应你的OnSock1函数
      

  4.   

    1、你要先进行FD_ACCEPT事件的才可以,直接一上来就FD-READ是不行的
    2、然后在触发的函数中在次进行FD_READ|FD_WRITE 才可以