我把线程函数改成普通函数,然后在OnInitDialog()里调用这个函数就会出现fatal error LNK1168,还有绑定错误。如果改成线程函数,在OnInitDialog()里面调用AfxBeginThread(&thread,0);就没有任何错误,而且服务器创建成功?代码如下:OnInitDialog():
         count=0;
m_list.InsertColumn(0,"消息");
m_list.SetColumnWidth(0,435);
m_edit.SetLimitText(99); serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_family=AF_INET;
serv.sin_port=htons(7431);
addrlen=sizeof(serv);
m_button.EnableWindow(FALSE); sock=socket(AF_INET,SOCK_STREAM,0);
if(bind(sock,(sockaddr*)&serv,sizeof(serv)))
{
m_edit.SetWindowText("绑定错误");
}else
{
m_edit.SetWindowText("服务器创建成功");
listen(sock,5);
AfxBeginThread(&thread,0);

}UINT thread(LPVOID p)
{
char buff[100];
CSize size;
size.cx=0;
size.cy=30;
int s=1;
CMySocketDlg *dlg=(CMySocketDlg*)AfxGetApp()->GetMainWnd();
dlg->sock=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addrlen));
if(dlg->sock==INVALID_SOCKET)
{
dlg->m_edit.SetWindowText("Error accept");
}
else
{
dlg->SetForegroundWindow();
dlg->m_list.InsertItem(dlg->count++,"连接成功");
dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr));
dlg->m_list.Scroll(size);
dlg->m_button.EnableWindow(TRUE);
}
while(s!=SOCKET_ERROR)
{
s=recv(dlg->msgsock,buff,100,0);
dlg->SetForegroundWindow();
if(s!=SOCKET_ERROR)
{
dlg->m_list.InsertItem(dlg->count++,buff);
dlg->m_list.Scroll(size); } }
send(dlg->msgsock,"Disconnected",100,0);
dlg->m_list.InsertItem(dlg->count++,"Disconnected");
dlg->m_list.Scroll(size);
dlg->msgsock=NULL;
dlg->m_button.EnableWindow(FALSE);
closesocket(dlg->msgsock); AfxEndThread(0);
return 0;

}

解决方案 »

  1.   


    还有为什么要得到对话框句柄,每次都要dlg->sock这样,直接用sock不行吗?
      

  2.   

    因为sock是在那个窗口里定义的,所以要用dlg->sock,去看MySocketDlg.h
      

  3.   

    因为sock是在那个窗口里定义的,所以要用dlg->sock,去看MySocketDlg.h-------------
    因为是基于对话框的程序,而且只有这一个对话框,随意我想不用dlg->这样也行吧
      

  4.   

    可你的thread程序是不属于对话框的
      

  5.   


    可你的thread程序是不属于对话框的
    ----------哦,是的。不明白呀  初始化的问题?
    -------我想也是的,在初始化肯定只能做一些简单的初识化工作,调用那个函数就会等待连接,然后对话框都出不来....主要是都没用过线程,不是很了解,晚上结贴。
      

  6.   

    你掉用的是基于窗口的函数,程序必须完全初始化创建窗口后才能调用.///
    我想也是的,在初始化肯定只能做一些简单的初识化工作,调用那个函数就会等待连接,然后对话框都出不来....主要是都没用过线程,不是很了解,晚上结贴。
    //
    这是因为程序要等Initial返回值后才能弹出窗口