您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 关于聊天室程序的问题~

关于聊天室程序的问题~

来源:网络整理     时间:2016/8/5 6:09:26     关键词:

关于网友提出的“ 关于聊天室程序的问题~”问题疑问,本网通过在网上对“ 关于聊天室程序的问题~”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 关于聊天室程序的问题~
描述:

我按照孙鑫老师所讲的步骤自己把这个程序从头到尾的从写出来,
可是在我运行的时候出现了一个问题,即向"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:发送信息框


解决方案1:

要知道代码放在哪儿是干什么用的>
为什么在这儿写呢?
把整个思路搞明白了问题了就出来了
不要说按照谁搞的东东写上去,自己还不知错在哪儿

解决方案2:

if(retval=SOCKET_ERROR)
  break;
出问题了。应该是
if(retval==SOCKET_ERROR)
  break;


以上介绍了“ 关于聊天室程序的问题~”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3118680.html

相关图片

相关文章