对话框死掉

smdszgzh 2009-03-27 09:55:16
我运行后,点击SET按钮,程序就死掉,而且也不输出

void CMySerSocketDlg::OnSet()
{
WSADATA m_data;
CString m_Msg,mMsg1;
CWnd *hwnd=GetDlgItem(IDC_EDIT);
if(WSAStartup(MAKEWORD(2,2),&m_data)!=0)
{
m_Msg="Load Socket Library failed!";
hwnd->SetWindowText(m_Msg);
return;

}

m_Msg="服务器已启动,等待用户连接!";//界面不输出这些字符,而是直接死掉
hwnd->SetWindowText(m_Msg);
SOCKET SerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
SOCKET CliSocket;
if(INVALID_SOCKET==SerSocket)
{
m_Msg="Create Socket Failed!";
hwnd->SetWindowText(m_Msg);
return;
}
sockaddr_in Seraddr,Cliaddr;
Seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
Seraddr.sin_family=AF_INET;
Seraddr.sin_port=htons(8000);
bind(SerSocket,(sockaddr*)&Seraddr,sizeof(Seraddr)+1);
int n=listen(SerSocket,5);
if(n==SOCKET_ERROR)
{
m_Msg="Listen failed!";
hwnd->SetWindowText(m_Msg);
return;
}
// m_Msg="服务器已启动,等待用户连接!";
// hwnd->SetWindowText(m_Msg);
CWnd *hwnd1=GetDlgItem(IDC_EDIT1);
while(true)
{
int m=sizeof(Cliaddr);
CliSocket=accept(SerSocket,(sockaddr*)&Cliaddr,&m);
char *recBuff=new char[100];
char *sendBuff=new char[100];
int length=_msize(recBuff);
sendBuff="Wellcom!";
send(CliSocket,sendBuff,length+1,0);
m_Msg=sendBuff;
hwnd->SetWindowText(m_Msg);
while(true)
{
recv(CliSocket,recBuff,length+1,0);
if(recBuff[0]=='q'||recBuff[0]=='Q')
{
m_Msg="用户请求退出!";
hwnd->SetWindowText(m_Msg);
return;
}
m_Msg=recBuff;
hwnd->SetWindowText(recBuff);
hwnd1->GetWindowText(mMsg1);
recBuff=mMsg1.GetBuffer(mMsg1.GetLength());
send(CliSocket,sendBuff,length+1,0);
mMsg1.ReleaseBuffer();
//mMsg1="";
}

}
closesocket(SerSocket);
WSACleanup();
// TODO: Add your control notification handler code here

}
...全文
104 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2009-03-29
  • 打赏
  • 举报
回复
把耗时的操作都不要放到UI线程中,而是应该在工作线程中处理..防止界面 hung
cnzdgs 2009-03-29
  • 打赏
  • 举报
回复
如果不让界面死掉,程序的主线程需要正常执行消息循环,在响应消息时应尽快处理完返回,对于这种阻塞式的网络收发功能应该另外创建一个线程,把这些代码都放到线程里面执行。
hust_terry 2009-03-28
  • 打赏
  • 举报
回复
这是典型的UI线程阻塞了,解决 方式就是起一个线程,在线程里面去接收数据,发消息到主线程负责界面数据更新。
smdszgzh 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wzaen 的回复:]
这样干界面肯定是没反应了,如楼上所说,放到线程里面吧。另,return之前注意句柄资源的释放。
[/Quote]
在线程里做这些什么意思??在ON_Set函数里创建一个线程?然后在线程函数里做这些???为什么???
还有句柄资源要释放??
我新手,麻烦帮解答一下!
wzaen 2009-03-27
  • 打赏
  • 举报
回复
这样干界面肯定是没反应了,如楼上所说,放到线程里面吧。另,return之前注意句柄资源的释放。
#Page# 2009-03-27
  • 打赏
  • 举报
回复
呵呵,这种while循环和阻塞读取放到线程好一点。
ouyh12345 2009-03-27
  • 打赏
  • 举报
回复
在连接之前输出
应该是socket阻塞了,在线程里做这些

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧