首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于聊天室程序的有关问题

2012-01-14 
关于聊天室程序的问题~我按照孙鑫老师所讲的步骤自己把这个程序从头到尾的从写出来,可是在我运行的时候出

关于聊天室程序的问题~
我按照孙鑫老师所讲的步骤自己把这个程序从头到尾的从写出来,

可是在我运行的时候出现了一个问题,即向 "127.0.0.1 "发送数据后无法收到,个人感觉,在创建了一个新的线程用于接收信息后,该线程并没有获得执行权,是不是这个问题?

我是个新手,还请各位大侠赐教!

部分代码如下:

BOOL   CChatApp::InitInstance()
{
if(!AfxSocketInit())
{
AfxMessageBox( "加载套接字库失败! ");
return   false;
}
.............
}
 
//   ChatDlg.h   :   header   file
//

#if   !defined(AFX_CHATDLG_H__27F8EFCB_80FF_4D1B_8067_6384AD92EF24__INCLUDED_)
#define   AFX_CHATDLG_H__27F8EFCB_80FF_4D1B_8067_6384AD92EF24__INCLUDED_

#if   _MSC_VER   >   1000
#pragma   once
#endif   //   _MSC_VER   >   1000

/////////////////////////////////////////////////////////////////////////////
//   CChatDlg   dialog

#define   WM_RECVDATA     WM_USER+1//自定义消息

struct   RECVPRARM
{
SOCKET   sock;
HWND   hWnd;
};//自定义结构体

class   CChatDlg   :   public   CDialog
{
//   Construction
public:
BOOL   InitSocket(void);
static   DWORD   WINAPI   RecvProc(LPVOID);
CChatDlg(CWnd*   pParent   =   NULL);//   standard   constructor
public:
SOCKET   m_sock;

//   Dialog   Data
//{{AFX_DATA(CChatDlg)
enum   {   IDD   =   IDD_CHAT_DIALOG   };
//   NOTE:   the   ClassWizard   will   add   data   members   here
//}}AFX_DATA

//   ClassWizard   generated   virtual   function   overrides
//{{AFX_VIRTUAL(CChatDlg)
protected:
virtual   void   DoDataExchange(CDataExchange*   pDX);//   DDX/DDV   support
//}}AFX_VIRTUAL

//   Implementation
protected:
HICON   m_hIcon;

//   Generated   message   map   functions
//{{AFX_MSG(CChatDlg)
virtual   BOOL   OnInitDialog();
afx_msg   void   OnSysCommand(UINT   nID,   LPARAM   lParam);
afx_msg   void   OnPaint();
afx_msg   HCURSOR   OnQueryDragIcon();
afx_msg   void   OnSend();
//}}AFX_MSG
afx_msg   void   OnRecvData(WPARAM   wParam,LPARAM   lParam);
DECLARE_MESSAGE_MAP()
};
...............


//   ChatDlg.cpp   :   implementation   file
//

#include   "stdafx.h "
#include   "Chat.h "
#include   "ChatDlg.h "

#ifdef   _DEBUG
#define   new   DEBUG_NEW
#undef   THIS_FILE
static   char   THIS_FILE[]   =   __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
//   CAboutDlg   dialog   used   for   App   About

class   CAboutDlg   :   public   CDialog
{
public:
CAboutDlg();

//   Dialog   Data
//{{AFX_DATA(CAboutDlg)
enum   {   IDD   =   IDD_ABOUTBOX   };
//}}AFX_DATA

//   ClassWizard   generated   virtual   function   overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual   void   DoDataExchange(CDataExchange*   pDX);         //   DDX/DDV   support
//}}AFX_VIRTUAL

//   Implementation
protected:
//{{AFX_MSG(CAboutDlg)


//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg()   :   CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}

void   CAboutDlg::DoDataExchange(CDataExchange*   pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg,   CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//   No   message   handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
//   CChatDlg   dialog

...................

void   CChatDlg::DoDataExchange(CDataExchange*   pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CChatDlg)
//   NOTE:   the   ClassWizard   will   add   DDX   and   DDV   calls   here
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CChatDlg,   CDialog)
//{{AFX_MSG_MAP(CChatDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_SEND,   OnSend)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_RECVDATA,OnRecvData)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
//   CChatDlg   message   handlers

BOOL   CChatDlg::OnInitDialog()
{
............

//   TODO:   Add   extra   initialization   here
InitSocket();
RECVPRARM   *recvPraram=new   RECVPRARM;
recvPraram-> hWnd=m_hWnd;
recvPraram-> sock=m_sock;
HANDLE   hThread=CreateThread(NULL,0,RecvProc,(LPVOID)recvPraram,0,NULL);
CloseHandle(hThread);

return   TRUE;     //   return   TRUE     unless   you   set   the   focus   to   a   control
}

............


BOOL   CChatDlg::InitSocket(void)
{
m_sock=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==m_sock)
{
MessageBox( "初始化套接字失败! ");
return   false;
}

SOCKADDR_IN   addrSock;
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(6000);

int   retval;
retval=bind(m_sock,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
closesocket(m_sock);
MessageBox( "绑定失败! ");
return   false;
}

return   true;
}

DWORD   WINAPI   CChatDlg::RecvProc(LPVOID   lpParameter)
{
SOCKET   sock=((RECVPRARM*)lpParameter)-> sock;
HWND   hWnd=((RECVPRARM*)lpParameter)-> hWnd;

SOCKADDR_IN   addrFrom;
int   len=sizeof(SOCKADDR);
char   tempbuf[300];
char   recvbuf[200];
int   retval;
while(true)
{
retval=recvfrom(sock,recvbuf,200,0,(SOCKADDR*)&addrFrom,&len);
if(retval=SOCKET_ERROR)
break;
sprintf(tempbuf, "%s说:   %s ",inet_ntoa(addrFrom.sin_addr),recvbuf);
::PostMessage(hWnd,WM_RECVDATA,0,(LPARAM)tempbuf);
}
return   0;
}

void   CChatDlg::OnRecvData(WPARAM   wParam,LPARAM   lParam)
{
CString   str=(char*)lParam;
CString   strTemp;
GetDlgItemText(IDC_EDIT1,strTemp);
str+= "\r\n ";
str+=strTemp;
SetDlgItemText(IDC_EDIT1,str);
}


void   CChatDlg::OnSend()   //电击发送按钮


{
//   TODO:   Add   your   control   notification   handler   code   here
DWORD   dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))-> GetAddress(dwIP);
SOCKADDR_IN   addrTo;
addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(6000);

CString   strSend;
GetDlgItemText(IDC_EDIT2,strSend);
sendto(m_sock,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
SetDlgItemText(IDC_EDIT2, " ");

}

IDC_EDIT1:接受信息框
IDC_EDIT2:发送信息框




[解决办法]
if(retval=SOCKET_ERROR)
break;
出问题了。应该是
if(retval==SOCKET_ERROR)
break;


[解决办法]
要知道代码放在哪儿是干什么用的>

为什么在这儿写呢?

把整个思路搞明白了问题了就出来了

不要说按照谁搞的东东写上去,自己还不知错在哪儿

热点排行