基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx
- 文档编号:13972039
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:15
- 大小:93.41KB
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx
《基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx》由会员分享,可在线阅读,更多相关《基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx(15页珍藏版)》请在冰点文库上搜索。
基于winsockAPI函数的MFC网络应用程序分析毕业设计论文
实验报告
1.实验名称
基于winsockAPI与MFC的网络程序的编写与分析。
2.实验目的
(1)进一步熟练掌握常用的WinSockAPI函数。
(2)掌握基于MFC的简单应用程序的编写方法,理解VC编写的Windows应用程序的运行机制。
(3)掌握基于WinSockAPI函数与MFC的网络通信程序的编写方法。
3.实验地点
一实验楼510机房
4.实验环境
计算机局域网、VisualC++6.0
5.实验性质
实验性质:
验证性。
6.实验学时
实验课时:
2学时。
7.实验内容
(1)基于WinSockAPI函数和UDP协议的网络通信MFC程序的界面制作。
(2)基于WinSockAPI函数和UDP协议的网络聊天MFC程序的代码编写。
(3)聊天程序在局域网中两台不同电脑上的测试。
(4)聊天程序在同一台电脑上的测试。
(5)聊天程序核心代码分析说明。
8.实验步骤
(1)基于WinSockAPI函数和UDP协议的网络通信MFC程序的界面制作。
①在VisualC++6.0中,利用MFCAppWizard[exe]新建一个工程,自拟工程名称,并注意设置该工程的保存位置(如图1所示),选择应用程序类型为“基本对话框”(如图2所示,并注意选中WOSA支持(如图3所示),其余采用默认。
图1
图2
图3
②在得到的工程的对话框资源上,放置两个文本控件,两个命令按钮,一个框架控件并修改各控件的属性和布局如图4所示。
图4
(2)基于WinSockAPI函数和UDP协议的网络聊天MFC程序的代码编写。
WyChat.h的主要代码如下:
classCWyChatApp:
publicCWinApp
{
public:
CWyChatApp();
~CWyChatApp();//添加的析构函数,便于WinSock函数库的注销
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CWyChatApp)
public:
virtualBOOLInitInstance();
//}}AFX_VIRTUAL
//Implementation
//{{AFX_MSG(CWyChatApp)
//NOTE-theClassWizardwilladdandremovememberfunctionshere.
//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
WyChat.cpp的主要代码如下:
CWyChatApp:
:
~CWyChatApp()//析构函数
{
WSACleanup();//注销WinSock函数库
}
/////////////////////////////////////////////////////////////////////////////
//TheoneandonlyCWyChatAppobject
CWyChatApptheApp;
/////////////////////////////////////////////////////////////////////////////
//CWyChatAppinitialization
BOOLCWyChatApp:
:
InitInstance()//在初始化函数中注册WinSock函数库
{
//if(!
AfxSocketInit())
//{
//AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
//returnFALSE;
//}
WORDwVersionRequested;
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!
=0){
returnFALSE;
}
if(LOBYTE(wsaData.wVersion)!
=2||
HIBYTE(wsaData.wVersion)!
=2){
WSACleanup();
returnFALSE;
}
AfxEnableControlContainer();
WyChatDlg.h的主要代码如下:
#defineMSG_SOCKWM_USER+1//自行定义的WinSock套接字消息编号
/////////////////////////////////////////////////////////////////////////////
//CWyChatDlgdialog
classCWyChatDlg:
publicCDialog
{
//Construction
public:
CWyChatDlg(CWnd*pParent=NULL);//standardconstructor
~CWyChatDlg();//自行添加的对话框析构函数
//DialogData
//{{AFX_DATA(CWyChatDlg)
enum{IDD=IDD_WYCHAT_DIALOG};
//NOTE:
theClassWizardwilladddatamembershere
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CWyChatDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
HICONm_hIcon;
//Generatedmessagemapfunctions
//{{AFX_MSG(CWyChatDlg)
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
afx_msgvoidOnSend();
//}}AFX_MSG
afx_msgvoidOnSock(WPARAM,LPARAM);//自行添加的套接字响应函数
DECLARE_MESSAGE_MAP()
private:
SOCKETm_socket;//自行定义的私有套接字成员变量
public:
BOOLInitSocket();//自行定义的套接字初始化函数
};
WyChatDlg.cpp的主要代码如下:
CWyChatDlg:
:
~CWyChatDlg()//自行添加的析构函数
{
if(m_socket)
{
closesocket(m_socket);//关闭套接字
}
}
BEGIN_MESSAGE_MAP(CWyChatDlg,CDialog)
//{{AFX_MSG_MAP(CWyChatDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDSEND,OnSend)
//}}AFX_MSG_MAP
ON_MESSAGE(MSG_SOCK,OnSock)//自行添加的消息关联
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CWyChatDlgmessagehandlers
BOOLCWyChatDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
InitSocket();//自行添加的套接字初始化函数调用
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
BOOLCWyChatDlg:
:
InitSocket()
{
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==m_socket)
{
inta=WSAGetLastError();
CStringstr;
str.Format("%d",a);
MessageBox(str);
returnFALSE;
}
SOCKADDR_INaddrSock;
addrSock.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(5003);
if(bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR))==SOCKET_ERROR)
{
//AfxMessageBox(_T("bindfailed!
"));
inta=WSAGetLastError();
CStringstr;
str.Format("bind=%d",a);
AfxMessageBox(str);
returnFALSE;
}
if(WSAAsyncSelect(m_socket,m_hWnd,MSG_SOCK,FD_READ|FD_WRITE)==SOCKET_ERROR)
{
AfxMessageBox(_T("registerreadeventofnetfailed!
"));
returnFALSE;
}
returnTRUE;
}
voidCWyChatDlg:
:
OnSock(WPARAMwParam,LPARAMlParam)
{
switch(LOWORD(lParam))
{
caseFD_READ:
{
charbuff[254];
sockaddr_inaddr2;
intn=sizeof(addr2);
longcharNum=0;
CStringstrFileLen="";
charNum=:
:
recvfrom(m_socket,buff,sizeof(buff),0,(sockaddr*)&addr2,&n);
buff[charNum]='\0';//在接收缓冲区实际接收到的字符串尾部加上结束标志
CStringstrTemp;
GetDlgItemText(IDC_EDITChat,strTemp);
strTemp=strTemp+"\r\n"+"对方说:
"+buff;
//SetDlgItemText(IDC_EDITChat,buff);
SetDlgItemText(IDC_EDITChat,strTemp);
UpdateData(false);
break;
}
caseFD_WRITE:
{
}
default:
break;
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCWyChatDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCWyChatDlg:
:
OnSend()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringstrSend;
GetDlgItemText(IDC_EDIT_Send,strSend);
sockaddr_inaddr,addr2;
intn=sizeof(addr2);
charbuff[10]={0};
addr.sin_family=AF_INET;
addr.sin_port=htons(7600);//设置对方的端口号
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//设置对方的IP
/*intn1=strSend.GetLength();
CStringmsg;
msg.Format("%d",n1);
MessageBox(msg);
*/
if(strSend.GetLength()!
=0)
{:
:
sendto(m_socket,strSend,strSend.GetLength(),0,(sockaddr*)&addr,n);
CStringstrTemp;
CStringmyChat;
GetDlgItemText(IDC_EDITChat,strTemp);
GetDlgItemText(IDC_EDIT_Send,myChat);
strTemp=strTemp+"\r\n"+"你说:
"+myChat;
//SetDlgItemText(IDC_EDITChat,buff);
SetDlgItemText(IDC_EDITChat,strTemp);
SetDlgItemText(IDC_EDIT_Send,"");
}
else
{
AfxMessageBox(_T("不能发送空消息!
"));
}
}
(3)聊天程序在局域网中两台不同电脑上的测试。
每两个同学(称为甲乙)为一小组,分别在两台不同的电脑上编写程序,注意双方本机与远程机IP地址、端口号的正确设定。
若程序编写好后,双方均启动程序,验证并观察双方的通信反馈信息,进行即时的点到点的在线聊天。
在甲同学编写的WyChatDlg.cpp文件中的BOOLCWyChatDlg:
:
InitSocket()函数中,有如下代码:
SOCKADDR_INaddrSock;
addrSock.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(5003);
上述代码是用于设定本机中套接字的本地端口的。
在甲同学编写的WyChatDlg.cpp文件中的voidCWyChatDlg:
:
OnSend()函数中,有如下代码:
addr.sin_family=AF_INET;
addr.sin_port=htons(7600);//设置对方的端口号
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//设置对方的IP
上述代码是用于设定对方的主机IP以及对应套接字的端口号码的。
注意上述端口中一个为5003,一个为7600,注意乙同学的程序代码中,应该讲这两个端口号码交换过来。
(4)聊天程序在同一台电脑上的测试。
验证通过后,请每位同学在单机上调试验证,注意此时远程机IP为本机地址,即“127.0.0.1”。
(5)聊天程序核心代码分析说明。
9.实验思考
(1)若在聊天时,每个人都可设置自己的昵称,并可将该昵称发送给对方,程序应该如何修改?
(2)若在一台电脑上调试程序,同时运行两个程序实例会出现错误吗?
为什么会出现这样的错误?
如何修改程序才能避免这样的错误呢?
(3)实验中碰到一些什么样的其他问题?
你是如何解决的?
10.实验心得
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于winsock API函数的MFC网络应用程序分析毕业设计论文 基于 winsock API 函数 MFC 网络 应用程序 分析 毕业设计 论文