我才学网络编程呢。请多多指教。
创建MFC时勾选了windows socket, 然后创建一个启动按钮。以下是启动按钮的代码
void CServertestDlg::start() 
{
// TODO: Add your control notification handler code here
HANDLE hThread;
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReceiveData,this,NULL,&idThread);
} UINT ReceiveData(LPVOID pParam) {
CServertestDlg *dlg=(CServertestDlg*)pParam;
CSocket server;
if(server.Create(9000,SOCK_DGRAM,NULL)==0)
{
AfxMessageBox("创建Socket失败");

            return -1;
}
for(;;)
{
sockaddr_in clientaddr;
int clientaddrlen=sizeof(clientaddr);
char echobuffer[1024];
int recvmsgsize=server.ReceiveFrom(echobuffer,1024,(SOCKADDR*)&clientaddr,&clientaddrlen,0);
if(recvmsgsize<=0)
{
AfxMessageBox("RecvFrom() failed"); }
echobuffer[recvmsgsize]='\0';
dlg->m_edit.ReplaceSel(echobuffer);
server.Close();
}
}运行后出现C:\Program Files\Microsoft Visual Studio\MyProjects\Servertest\ServertestDlg.cpp(177) : error C2065: 'ReceiveData' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\MyProjects\Servertest\ServertestDlg.cpp(177) : error C2664: 'CreateThread' : cannot convert parameter 6 from 'void ** ' to 'unsigned long *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
C:\Program Files\Microsoft Visual Studio\MyProjects\Servertest\ServertestDlg.cpp(182) : error C2373: 'ReceiveData' : redefinition; different type modifiers
执行 cl.exe 时出错.

解决方案 »

  1.   

    把ReceiveData定义出CServertestDlg的静态成员函数.
      

  2.   

    DWORD WINAPI ReceiveData(
    LPVOID lpParameter   // thread data
    );
    void CServertestDlg::start() 
    {
        // TODO: Add your control notification handler code here
        HANDLE hThread;
        hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReceiveData,this,NULL,&idThread);
    }    DWORD WINAPI ReceiveData(LPVOID lpParameter)    {
            CServertestDlg *dlg=(CServertestDlg*)pParam;
            CSocket server;
            if(server.Create(9000,SOCK_DGRAM,NULL)==0)
            {
                AfxMessageBox("创建Socket失败");
                
                return -1;
            }
            for(;;)
            {
                sockaddr_in clientaddr;
                int clientaddrlen=sizeof(clientaddr);
                char echobuffer[1024];
                int recvmsgsize=server.ReceiveFrom(echobuffer,1024,(SOCKADDR*)&clientaddr,&clientaddrlen,0);
                if(recvmsgsize<=0)
                {
                    AfxMessageBox("RecvFrom() failed");            }
                echobuffer[recvmsgsize]='\0';
                dlg->m_edit.ReplaceSel(echobuffer);
                server.Close();
            }
        }
      

  3.   

    DWORD WINAPI ReceiveData(
    LPVOID lpParameter   // thread data
    );
    void CServertestDlg::start() 
    {
        // TODO: Add your control notification handler code here
        HANDLE hThread;
        hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReceiveData,this,NULL,&idThread);
    }    DWORD WINAPI ReceiveData(LPVOID lpParameter)    {
            CServertestDlg *dlg=(CServertestDlg*)pParam;
            CSocket server;
            if(server.Create(9000,SOCK_DGRAM,NULL)==0)
            {
                AfxMessageBox("创建Socket失败");
                
                return -1;
            }
            for(;;)
            {
                sockaddr_in clientaddr;
                int clientaddrlen=sizeof(clientaddr);
                char echobuffer[1024];
                int recvmsgsize=server.ReceiveFrom(echobuffer,1024,(SOCKADDR*)&clientaddr,&clientaddrlen,0);
                if(recvmsgsize<=0)
                {
                    AfxMessageBox("RecvFrom() failed");            }
                echobuffer[recvmsgsize]='\0';
                dlg->m_edit.ReplaceSel(echobuffer);
                server.Close();
            }
        }
      

  4.   

    上面的问题解决了。但是的确createthread()第六个参数传递错误,是这样吗?先写
    DWORD idThread,然后hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReceiveData,this,NULL,(LPDWORD)&idThread);
    这样吗?