基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx

上传人:b****2 文档编号:13972039 上传时间:2023-06-19 格式:DOCX 页数:15 大小:93.41KB
下载 相关 举报
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第1页
第1页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第2页
第2页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第3页
第3页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第4页
第4页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第5页
第5页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第6页
第6页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第7页
第7页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第8页
第8页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第9页
第9页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第10页
第10页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第11页
第11页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第12页
第12页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第13页
第13页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第14页
第14页 / 共15页
基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx

《基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx》由会员分享,可在线阅读,更多相关《基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx(15页珍藏版)》请在冰点文库上搜索。

基于winsock API函数的MFC网络应用程序分析毕业设计论文.docx

基于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.实验心得

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2