读书人

这是什么原因?MFC有关问题

发布时间: 2012-05-21 18:04:41 作者: rapoo

这是什么原因?MFC问题

程序目标是实现一个简单的聊天室:
下面是客服端程序:
void CLtsDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CLtsDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CLtsDlg::OnButtonQidong()
{
// TODO: Add your control notification handler code here
CreateThread(NULL,0,LinsenThread,this,NULL,NULL);//创建一个新线程
}


ULONG WINAPI CLtsDlg::LinsenThread(LPVOID p){
CStringArray m_chater;
struct MEG
{
char ip[20];
char name[20];
char data[200];
}Meg,*pMeg;
CLtsDlg *pDlg=(CLtsDlg *)p;
CSocket m_ReceiveSocket;
char *buff[256];
CString data,name,chatIP;
m_ReceiveSocket.Create(8888,SOCK_DGRAM);
while(1){
m_ReceiveSocket.Receive(buff,256);
pMeg=(struct MEG*)buff;
data=pMeg->data;
name=pMeg->name;
if(data.IsEmpty()&&name.IsEmpty())
continue;
data=name+"说: "+data;
pDlg->m_show.InsertString(-1,data);
//判断发来信息的聊天者IP是否已存入聊天者列表
chatIP=pMeg->ip;
CString listIP;
bool flag=0;
int len=m_chater.GetSize();
//判断列表中是否已存在该用户
for(int i=0;i<=len;i++){
if(chatIP==m_chater.GetAt(i)){
flag=1;//列表中已存在该IP,则设为1
break;
}
}
if(!flag)
m_chater.Add(chatIP);
//把信息发送给列表中的每个客户
len=m_chater.GetSize();
for(int k=0;k<len;k++){
listIP=m_chater.GetAt(k);
//转发数据给其他聊天者
m_ReceiveSocket.SendTo(pMeg,sizeof(Meg),6666,listIP);
}
memset(buff,0,256);
}
m_ReceiveSocket.Close();
return 0;
}
下面是客服端程序:
void CLtzDlg::OnButtonJinru()
{
// TODO: Add your control notification handler code here
UpdateData(true);//获取本机的IP地址,存放到成员变量m——localIP中
char HostName[128];
if(gethostname(HostName,128)!=0)
return;
struct hostent* pHost;
pHost=gethostbyname(HostName);
LPCSTR lpIP=inet_ntoa(*(struct in_addr*)pHost->h_addr_list[0]);
m_localIP=lpIP;
m_enter.EnableWindow(false);
CreateThread(NULL,0,LinsenThread,this,NULL,NULL);// 创建一个新进程
}
ULONG WINAPI CLtzDlg::LinsenThread(LPVOID p){
struct MEG
{
char ip[20];
char name[20];
char data[200];
}Meg,*pMeg;
CLtzDlg *pDlg=(CLtzDlg *)p;
CSocket m_ReceiveSocket;
char *buff[256];
CString data,name;
m_ReceiveSocket.Create(6666,SOCK_DGRAM);
strcpy(Meg.ip,pDlg->m_localIP);
strcpy(Meg.name,pDlg->m_name);
strcpy(Meg.name,"我来了");
pMeg=&Meg;
m_ReceiveSocket.SendTo(pMeg,sizeof(Meg),8888,pDlg->m_toIP);
while(1){
int n=m_ReceiveSocket.Receive(buff,256);
if(n==0)
continue;
pMeg=(struct MEG*)buff;
data=pMeg->data;
name=pMeg->name;
if(data.IsEmpty()&&name.IsEmpty())
continue;
data=name+"说: "+data;
pDlg->m_show.InsertString(-1,data);
memset(buff,0,256);
}
return 0;
}

void CLtzDlg::OnButtonFasong()
{
// TODO: Add your control notification handler code here
UpdateData(true);
struct MEG
{
char ip[20];
char name[20];
char data[200];


}Meg,*pMeg;
CSocket m_SendSocket; //构造一个套接字对象
//发送数据的初始化
strcpy(Meg.ip,m_localIP);
strcpy(Meg.name,m_name);
strcpy(Meg.data,m_message);
pMeg=&Meg;
//数据发送
m_SendSocket.Create(1234,SOCK_DGRAM);
m_SendSocket.SendTo(pMeg,sizeof(Meg),8888,m_toIP);
m_SendSocket.Close();
}
请问我是哪里写错了。应该怎么改才可以?


[解决办法]
崩溃的时候在弹出的对话框按Retry进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

[解决办法]
端口错误
[解决办法]
char *buff[256];你确定是定义一个指针数组么?根据后面的代码看应该是
char buff[256];吧,而且定义了数组最好初始化下,

读书人网 >C++

热点推荐