导航:首页 > 源码编译 > 使用mfc编译实现聊天

使用mfc编译实现聊天

发布时间:2022-05-28 22:54:42

1. 问下MFC是如何实现语音聊天的。

语音聊天就要用到麦克风的声音捕获了,一般用的directsound或是directmusic,你可以搜一下相关的资料,捕获声音后,通过网络传输到另一客户端,然后播放出来, 这中间又用到socket编程 ,具体的请 到网上找相关资料,这些不是三两句话能说完的。

2. 有谁用过MFC编写过聊天工具,,局域网聊天工具网上有,问题是MFC能实现广域网聊天功能吗

看你的聊天工具是点对点还是只是与服务器通讯,服务器负责转发到其他指定的用户那里
这样的话,都差不多
用户,有独立因特网IP的,有局域网内网的,随便
用户的MFC聊天工具定时连接服务器检查有没有自己的信息,有就取过来显示
自己要发送信息,就连接服务器,把信息塞给服务器,告知发给哪位用户
完了

如果是点对点的,首先就是要知道对方的IP,局域网可以扫描,如果固定监听某个或某几个/某段端口的话,但是广域网必须有一个固定的服务器,直接有因特网IP的服务器
大家都去连接这个服务器,通过与服务器通信,查询在线人列表,IP,端口,拥有因特网IP地址的用户就可以直接连接对方的IP端口,要连接到内网的用户,就需要利用UDP协议来打洞,打洞好了的话,你就可以直接连接对方,而不需要通过服务器中转了

即使两个都是内网的用户聊天,打好洞,也就是路由器NAT做了端口映射,这两个内网用户就可以点对点直连了

3. 如何用标准C++写个聊天室程序

因为设计到消息的传送,必须使用socket编程
我目前知道两种方法 分别是winsock和ace_sock 就是windows的和ACE框架下
如果想实现聊天室不用MFC的话就需要自己手动生成界面 很难实现
下面分别给出windows和ace的关键代码 可以参考一下
//-----------------------------------
// ACE 部分
//----------------------------------
ACE::init();

ACE_INET_Addr DestAddr(8090, "192.168.208.24");

ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer ;

if(-1 == connector.connect(peer,DestAddr))
{
MessageBox("连接失败!");
}

ssize_t SendSize = peer.send_n("hello world\n",11);
peer.close();

ACE::fini();
}

//-----------------------------------
// Winsock 部分
//----------------------------------

WSADATA wsaData ;
int SrcAddr;
int err = WSAStartup(MAKEWORD(2,1),&wsaData);
if (err != 0) return;

struct sockaddr_in DestAddr;
memset(&DestAddr , 0 , sizeof(DestAddr));

DestAddr.sin_family = AF_INET;
DestAddr.sin_addr.s_addr = inet_addr("192.168.208.24");
DestAddr.sin_port = htons(8090);

SrcAddr = socket(AF_INET,SOCK_STREAM ,0);

int succ ;
if(connect(SrcAddr,(struct sockaddr *)&DestAddr,sizeof(DestAddr)) == 0)
{
succ = send(SrcAddr,"hello world",11,0);
}

shutdown(SrcAddr,2);
closesocket(SrcAddr);
WSACleanup();
}

我说的不够明白么 可以但是就用你现在学的东西不行 谭浩强的书太基础了

4. 如何利用MFC编写一个类似于QQ的聊天软件

要实现一个服务器一个客户端的聊天很简单,用UDP,知道IP端口就好办。我觉得要实现像QQ一样的聊天软件难点在1、外网通信,要NAT穿透什么的。。。两个路由器后面的IP就很难连接 2、多用户同时参与聊天时候后台的逻辑设计。。
可能说的不对,不过这是我当时想实现这类聊天软件功能时遇到的最大问题。
仅供交流= =

5. 用C语言实现语音聊天的mfc程序

世界本来就是一部分面向过程,一部分面向对象的,有些东西非要硬把他全面向对象,MFC就是这么个变态......
mfc里面都是封装好的类,算是C++了,你怎么用C写MFC程序?
C有C的C运行时库,WINDOWS下的C也可以直接用WINDOWS标准库(WindowsApi)
关于Windows音频开发的相关,可以参考《Windows程序设计》第二部分,第22章,里面有详细介绍音频的原理和如何从设备读入音频,如何向设备输出音频

6. vc++6.0编的基于MFC的简单的tcp聊天程序

4.1服务器端代码

开启服务器功能:

void OnServerOpen() //开启服务器功能
{
WSADATA wsaData;
int iErrorCode;
char chInfo[64];
if (WSAStartup(WINSOCK_VERSION, &wsaData)) //调用Windows Sockets DLL
{ MessageBeep(MB_ICONSTOP);
MessageBox("Winsock无法初始化!", AfxGetAppName(), MB_OK|MB_ICONSTOP);
WSACleanup();
return; }
else
WSACleanup();
if (gethostname(chInfo, sizeof(chInfo)))
{ ReportWinsockErr("\n无法获取主机!\n ");
return; }
CString csWinsockID = "\n==>>服务器功能开启在端口:No. ";
csWinsockID += itoa(m_pDoc->m_nServerPort, chInfo, 10);
csWinsockID += "\n";
PrintString(csWinsockID); //在程序视图显示提示信息的函数,读者可自行创建
m_pDoc->m_hServerSocket=socket(PF_INET, SOCK_STREAM, DEFAULT_PROTOCOL);
//创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
if (m_pDoc->m_hServerSocket == INVALID_SOCKET)
{ ReportWinsockErr("无法创建服务器socket!");
return;}
m_pDoc->m_sockServerAddr.sin_family = AF_INET;
m_pDoc->m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;
m_pDoc->m_sockServerAddr.sin_port = htons(m_pDoc->m_nServerPort);
if (bind(m_pDoc->m_hServerSocket, (LPSOCKADDR)&m_pDoc->m_sockServerAddr,
sizeof(m_pDoc->m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
{ReportWinsockErr("无法绑定服务器socket!");
return;}
iErrorCode=WSAAsyncSelect(m_pDoc->m_hServerSocket,m_hWnd,
WM_SERVER_ACCEPT, FD_ACCEPT);
//设定服务器相应的网络事件为FD_ACCEPT,即连接请求,
// 产生相应传递给窗口的消息为WM_SERVER_ACCEPT
if (iErrorCode == SOCKET_ERROR)
{ ReportWinsockErr("WSAAsyncSelect设定失败!");
return;}
if (listen(m_pDoc->m_hServerSocket, QUEUE_SIZE) == SOCKET_ERROR) //开始监听客户连接请求
{ReportWinsockErr("服务器socket监听失败!");
m_pParentMenu->EnableMenuItem(ID_SERVER_OPEN, MF_ENABLED);
return;}
m_bServerIsOpen = TRUE; //监视服务器是否打开的变量
return;
}

响应客户发送聊天文字到服务器:ON_MESSAGE(WM_CLIENT_READ, OnClientRead)

LRESULT OnClientRead(WPARAM wParam, LPARAM lParam)
{
int iRead;
int iBufferLength;
int iEnd;
int iRemainSpace;
char chInBuffer[1024];
int i;
for(i=0;(i
//MAXClient是服务器可响应连接的最大数目
{}
if(i==MAXClient) return 0L;
iBufferLength = iRemainSpace = sizeof(chInBuffer);
iEnd = 0;
iRemainSpace -= iEnd;
iBytesRead = recv(m_aClientSocket[i], (LPSTR)(chInBuffer+iEnd), iSpaceRemaining, NO_FLAGS);
//用可控缓冲接收函数recv()来接收字符
iEnd+=iRead;
if (iBytesRead == SOCKET_ERROR)
ReportWinsockErr("recv出错!");
chInBuffer[iEnd] = '\0';
if (lstrlen(chInBuffer) != 0)
{PrintString(chInBuffer); //服务器端文字显示
OnServerBroadcast(chInBuffer); //自己编写的函数,向所有连接的客户广播这个客户的聊天文字
}
return(0L);
}

对于客户断开连接,会产生一个FD_CLOSE消息,只须相应地用closesocket()关闭相应的Socket即可,这个处理比较简单。

4.2客户端代码

连接到服务器:

void OnSocketConnect()
{ WSADATA wsaData;
DWORD dwIPAddr;
SOCKADDR_IN sockAddr;
if(WSAStartup(WINSOCK_VERSION,&wsaData)) //调用Windows Sockets DLL
{MessageBox("Winsock无法初始化!",NULL,MB_OK);
return;
}
m_hSocket=socket(PF_INET,SOCK_STREAM,0); //创建面向连接的socket
sockAddr.sin_family=AF_INET; //使用TCP/IP协议
sockAddr.sin_port=m_iPort; //客户端指定的IP地址
sockAddr.sin_addr.S_un.S_addr=dwIPAddr;
int nConnect=connect(m_hSocket,(LPSOCKADDR)&sockAddr,sizeof(sockAddr)); //请求连接
if(nConnect)
ReportWinsockErr("连接失败!");
else
MessageBox("连接成功!",NULL,MB_OK);
int iErrorCode=WSAAsyncSelect(m_hSocket,m_hWnd,WM_SOCKET_READ,FD_READ);
//指定响应的事件,为服务器发送来字符
if(iErrorCode==SOCKET_ERROR)
MessageBox("WSAAsyncSelect设定失败!");
}

接收服务器端发送的字符也使用可控缓冲接收函数recv(),客户端聊天的字符发送使用数据可控缓冲发送函数send(),这两个过程比较简单,在此就不加赘述了。

7. 用MFC写一个聊天工具 要用到哪些方面的知识

就这些:

16.聊天室服务器端逻辑
一、服务器端所声明的类
class CCSocketDlg : public CDialog
{
// Construction
public:
CCSocketDlg(CWnd* pParent = NULL); // standard constructor
~CCSocketDlg();
// Dialog Data
//{{AFX_DATA(CCSocketDlg)
enum { IDD = IDD_CSOCKET_DIALOG };
CButton m_button;
CListCtrl m_list;
CEdit m_edit;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCSocketDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CCSocketDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
virtual void OnOK();
afx_msg void OnButton1();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
WSADATA wsaData;
SOCKET clisock;
SOCKET sListen, sAccept;
int addlen;
int count,s;
int getcount();
void sendtoall(SOCKET,char*);
struct sockaddr_in ser, cli; //服务器和客户的地址
int iLen; //客户地址长度
int iSend;//发送的数据长度
int flag;//标志位
char buf[1000];//要发送给客户的信息
void CRS();
};
UINT thread(LPVOID);
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CSOCKETDLG_H__2DFDFAF0_3473_43E6_A5CB_DBB8531B370E__INCLUDED_)
二、服务器端
// CSocketDlg.cpp : implementation file
//服务器端

#include "stdafx.h"
#include "CSocket.h"
#include "CSocketDlg.h"
#include <io.h>

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()

/////////////////////////////////////////////////////////////////////////////
// CCSocketDlg dialog

CCSocketDlg::CCSocketDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCSocketDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCSocketDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCSocketDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCSocketDlg)
DDX_Control(pDX, IDC_BUTTON1, m_button);
DDX_Control(pDX, IDC_LIST1, m_list);
DDX_Control(pDX, IDC_EDIT1, m_edit);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCSocketDlg, CDialog)
//{{AFX_MSG_MAP(CCSocketDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCSocketDlg message handlers
//初始化对话框
BOOL CCSocketDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
int count,s=1;
// char buff[100];
CDialog a;
CCSocketDlg *dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
count=0;
m_list.InsertColumn(0,"消息");
m_list.SetColumnWidth(0,435);
m_edit.SetLimitText(99);
dlg->sAccept=NULL;
//设定地址
dlg->ser.sin_addr.s_addr=htonl(INADDR_ANY);
dlg->ser.sin_family=AF_INET;
dlg->ser.sin_port=htons(5000);
addlen=sizeof(dlg->ser);
m_button.EnableWindow(FALSE);

//创建服务器端的套接口
dlg->sListen=socket(AF_INET,SOCK_STREAM,0);
if (dlg->sListen==INVALID_SOCKET)
{
m_edit.SetWindowText("创建套接口失败");
return FALSE;
}

//绑定
if (bind(dlg->sListen,(SOCKADDR*)&(dlg->ser),addlen))=SOCKET_ERROR)
{
closesocket(dlg->sListen);
m_edit.SetWindowText("绑定错误");
return FALSE;
}
else{
m_edit.SetWindowText("服务器创建成功");

//开始侦听
if (listen(dlg->sListen,5)==SOCKET_ERROR)
{
m_edit.SetWindowText("侦听失败");
return FALSE;
}

CRS();
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CCSocketDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CCSocketDlg::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 CCSocketDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CCSocketDlg::OnOK()
{
// CDialog::OnOK();
}
//发送数据
void CCSocketDlg::OnButton1()
{
char buff[100];
m_edit.GetWindowText(buff,99);
m_edit.SetWindowText("");
m_list.InsertItem(count++,buff);
//m_list.Scroll(size);
if (sAccept!=NULL)
//发送
send(sAccept,buff,100,0);
}
CCSocketDlg::~CCSocketDlg()
{
if (sAccept!=NULL)
send(sAccept,"Disconnected",100,0);
}
void CCSocketDlg::CRS()
{
char buff[100];
CCSocketDlg *dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
//初始化客户地址长度参数
iLen=sizeof(dlg->cli);
//进入一个无限循环,等待客户的连接请求
while(1)
{
dlg->sAccept=accept(dlg->sListen,(sockaddr*)&(dlg->ser),&(dlg->iLen));
if (dlg->sAccept==INVALID_SOCKET)
{ dlg->m_edit.SetWindowText("Error accept");}
dlg->m_list.InsertItem(dlg->count++,"连接成功");
char *ctime( const time_t *timer );
time_t ltime;
time(<ime);
dlg->m_list.InsertItem(dlg->count++,ctime( <ime ) );
s=recv(dlg->sAccept,buff,100,0);
dlg->SetForegroundWindow();
if (s!=SOCKET_ERROR)
{
dlg->m_list.InsertItem(dlg->count++,buff);
dlg->m_list.InsertItem(dlg->count++,ctime( <ime ) );

if (dlg->sAccept!=NULL)
//发送
send(dlg->sAccept,buff,100,0);
//dlg->sendtoall(dlg->sAccept,buff);
closesocket(dlg->sAccept);
}
}//end While
closesocket(dlg->sListen);
WSACleanup();
}

8. MFC聊天室怎么实现

分服务器和客户端,利用CSocket类(套接字),思想:首先服务器端创建套接字,bind将套接字与本地IP绑定,然后监听(listen)通知TCP服务器准备链接请求,ACCEPT等待接收客户端链接请求,send/read信息,关闭套接字。客户端创建套接字,之后connect链接服务器,send/read信息,close套接字。再结合MFC的控件,这个程序不难。最好找些资料阅读一下就行 了。

9. MFC中基于UDP编写一个简单的聊天室程序,其中在获取对方IP地址时有这么一句:

GetDlgItem(IDC_IPADDRESS1))是获取控件ID为IDC_IPADDRESS1的句柄
这个是MFC里的IP控件,调用GetAddress,取得IP地址,然后强转成CIPAddressCtrl*指针类型。

阅读全文

与使用mfc编译实现聊天相关的资料

热点内容
货拉拉app在哪里选收藏司机 浏览:541
如何从安卓转移照片到ipad 浏览:494
马士兵java全集 浏览:89
农行APP未付款订单怎么付 浏览:154
生成编译 浏览:591
联通河南服务器dns地址 浏览:904
如何更改应用加密的画面 浏览:815
河道断面图算法 浏览:179
java文件夹监控 浏览:353
wapp管理系统源码 浏览:276
我的世界服务器进去如何从成员调成管理员 浏览:889
汽车压缩机用什么机油好 浏览:838
phpexcel文件上传 浏览:252
如何静音手机的某个app 浏览:889
半导体工艺pdf 浏览:782
命令和意愿的一致才不会掉链 浏览:657
设计模式java装饰模式 浏览:694
恋听app哪里下载 浏览:709
金铲铲之战为什么一直服务器满 浏览:74
安卓手机如何像苹果一样app资源库 浏览:129