网络编程之套接字程序实现头歌(udp套接字编程)

http://www.itjxue.com  2023-02-04 20:11  来源:未知  点击次数: 

如何用MFC实现网络编程

?????一.?客户端?

?????1.?创建一个Dialog?Based项目:CSockClient。?

?????2.?设计对话框?

?????去掉Ok和Cancle两个按钮,增加ID_Connect(连接)、ID_Send(发送)、ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量。?

?????Control?ID?????Type?????????Member

?????IDC_EDITMSG????CEdit???????m_MSG

?????IDC_LISTMSG????ClistBox????m_MSGS

?????3.?CAsyncSocket类用DoCallBack函数处理MFC消息,当一个网络事件发生时,DoCallBack函数按网络事件类型:FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT分别调用OnReceive、OnSend、OnAccept、OnConnect函数。

?????由于MFC把这些事件处理函数定义为虚函数,所以要生成一个新的C++类,以重载这些函数,做法如下:以Public方式继承CAsyncSocket类,生成新类MySock;为MySock类添加虚函数OnReceive、OnConnect、OnSend。?

?????4.?在MySock.ccp中添加以下代码?

?????#include?"CSockClient.h"

?????#include?"CSockClientDlg.h"

?????5.?在MySock.h中添加以下代码?

?????public:

?????BOOL?m_bConnected;????//是否连接

?????UINT?m_nLength;????//消息长度

?????char?m_szBuffer[4096];?//消息缓冲区

?????6.?在MySock.ccp中重载各函数?

?????MySock::MySock()

?????{

?????????m_nLength=0;

?????????memset(m_szBuffer,0,sizeof(m_szBuffer));

?????????m_bConnected=FALSE;

?????}

?????MySock::~MySock()

?????{

?????????//关闭套接字

?????if(m_hSocket!=INVALID_SOCKET)

?????Close();

?????}

?????void?MySock::OnReceive(int?nErrorCode)?

?????{

?????????m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);

?????????//下面两行代码用来获取对话框指针

?????CCSockClientApp*?pApp=(CCSockClientApp*)AfxGetApp();

?????????CCSockClientDlg*?pDlg=(CCSockClientDlg*)pApp-?m_pMainWnd;

?????????pDlg-?m_MSGS.InsertString(0,m_szBuffer);

?????????memset(m_szBuffer,0,sizeof(m_szBuffer));

?????????CAsyncSocket::OnReceive(nErrorCode);

?????}

?????void?MySock::OnSend(int?nErrorCode)?

?????{

?????????Send(m_szBuffer,m_nLength,0);

?????????m_nLength=0;

?????????memset(m_szBuffer,0,sizeof(m_szBuffer));

?????????//继续提请一个“读”的网络事件,接收Server消息

?????AsyncSelect(FD_READ);

?????????CAsyncSocket::OnSend(nErrorCode);

?????}

?????void?MySock::OnConnect(int?nErrorCode)?

?????{

?????????if?(nErrorCode==0)

?????????{

?????m_bConnected=TRUE;

?????CCSockClientApp*?pApp=(CCSockClientApp*)AfxGetApp();

?????CCSockClientDlg*?pDlg=(CCSockClientDlg*)pApp-?m_pMainWnd;

?????memcpy(m_szBuffer,"Connected?to?",13);

?????strncat(m_szBuffer,pDlg-?m_szServerAdr,

?????sizeof(pDlg-?m_szServerAdr));

?????pDlg-?m_MSGS.InsertString(0,m_szBuffer);

?????AsyncSelect(FD_READ);?////提请一个“读”的网络事件,准备接收

?????????}

?????????CAsyncSocket::OnConnect(nErrorCode);

?????}

?????7.?新建对话框IDD_Addr,用来输入IP地址和Port;生成新类CAddrDlg。增加两个Edit控件:IDC_Addr、IDC_Port按下表在ClassWizard中为CAddrDlg类添加变量。?

?????Control?ID????Type????Member

?????IDC_Addr????CString????m_Addr

?????IDC_Port????Int????????m_Port

?????8.?在CSockClientDlg.ccp中添加代码:?

?????#include?"AddrDlg.h"

?????protected:

?????????int?TryCount;

?????????MySock?m_clientSocket;

?????????UINT?m_szPort;

?????public:

?????????char?m_szServerAdr[256];????

?????9.?双击IDD_CSOCKCLIENT_DIALOG对话框中的“连接”按钮,添加以下代码:?

?????void?CCSockClientDlg::OnConnect()?

?????{

?????????m_clientSocket.ShutDown(2);

?????????m_clientSocket.m_hSocket=INVALID_SOCKET;

?????????m_clientSocket.m_bConnected=FALSE;

?????????CAddrDlg?m_Dlg;

?????????//默认端口1088

?????m_Dlg.m_Port=1088;

?????????if?(m_Dlg.DoModal()==IDOK??!m_Dlg.m_Addr.IsEmpty())

?????????{

?????memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_szServerAdr));

?????m_szPort=m_Dlg.m_Port;

?????//建立计时器,每1秒尝试连接一次,直到连上或TryCount10

?????SetTimer(1,1000,NULL);

?????TryCount=0;

?????????}

?????}

?????10.?添加Windows消息WM_TIMER响应函数OnTimer?

?????void?CCSockClientDlg::OnTimer(UINT?nIDEvent)?

?????{

?????????if?(m_clientSocket.m_hSocket==INVALID_SOCKET)

?????????{

?????BOOL?bFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT);

?????if(!bFlag)

?????{

?????????AfxMessageBox("Socket?Error!");

?????????m_clientSocket.Close();

?????????PostQuitMessage(0);

?????????return;

?????}

?????????}

?????????m_clientSocket.Connect(m_szServerAdr,m_szPort);

?????????TryCount++;

?????????if?(TryCount?=10?||?m_clientSocket.m_bConnected)

?????????{????

?????KillTimer(1);

?????if?(TryCount?=10)

?????????AfxMessageBox("Connect?Failed!");

?????return;

?????????}

?????????CDialog::OnTimer(nIDEvent);

?????}

?????11.?双击IDD_CSOCKCLIENT_DIALOG对话框中的“发送”按钮,添加以下代码:?

?????void?CCSockClientDlg::OnSend()?

?????{

?????????if?(m_clientSocket.m_bConnected)

?????????{

?????m_clientSocket.m_nLength=m_MSG.GetWindowText

?????(m_clientSocket.m_szBuffer,?sizeof(m_clientSocket.m_szBuffer));

?????m_clientSocket.AsyncSelect(FD_WRITE);

?????m_MSG.SetWindowText("");

?????????}

?????}

?????12.?双击IDD_CSOCKCLIENT_DIALOG对话框中的“关闭”按钮,添加以下代码:?

?????void?CCSockClientDlg::OnExit()?

?????{

?????????//关闭Socket

?????m_clientSocket.ShutDown(2);

?????????//关闭对话框

?????EndDialog(0);????

?????}

?????12.运行此项目,连接时输入主机名或IP均可,CAsyncSocket类会自动处理。

?????二.?服务端

?????Server端的编程与Client端的类似,下面主要介绍他的Listen及Accept函数。

?????1.?建立一个CNewSocket类,重载CAsyncSocket类的OnReceive、OnSend函数,如何进行信息的显示和发送可以参考Client程序。本例中采用将收到信息原封不动发回的方法来实现Echo功能,代码如下:

?????CNewSocket::OnReceive(int?nErrorCOde)

?????{

?????????m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);

?????????//?直接转发消息

?????AsyncSelect(FD_WRITE);

?????}

?????CNewSocket::OnSend(int?nErrorCode)

?????{

?????????Send(m_szBuffer,m_nLength,0);

?????}

?????2.?建立一个CMyServerSocket类,重载CAsyncSocket类的OnAccept函数代码如下

?????在MyServerSocket.h中声明变量

?????public::

?????CNewSocket*?m_pSocket;

?????void?CMyServerSocket::OnAccept(int?nErrorCode)

?????{

?????????//侦听到连接请求,调用Accept函数

?????????CNewSocket*?pSocket?=?new?CNewSocket();

?????????if?(Accept(*pSocket))

?????????{

?????pSocket-?AsyncSelect(FD_READ);

?????m_pSocket=pSocket;

?????????}

?????????else

?????delete?pSocket;

?????}

?????3.?为对话框添加一个“侦听”按钮,添加如下代码:

?????在CsockServerDlg.ccp中声明变量

?????public:

?????????CMyServerSocket?m_srvrSocket;

?????void?CCSockServerDlg::OnListen()

?????{

?????????if?(m_srvrSocket.m_hSocket==INVALID_SOCKET)

?????????{

?????BOOL?bFlag=m_srvrSocket.Create

?????(UserPort,SOCK_STREAM,FD_ACCEPT);

?????if?(!bFlag)

?????{

?????????AfxMessageBox(“Socket?Error!”);

?????????M_srvrSocket.Close();

?????????PostQuitMessage(0);

?????????Return;

?????}

?????????}

?????//“侦听”成功,等待连接请求

?????if?(!m_srvrSocket。Listen(1))

?????{

?????int?nErrorCode?=?m_srvrSocket.GetLastError();

?????if?(nError!=WSAEWOULDBLOCK)

?????{

?????????AfxMessageBox(“Socket?Error!”);

?????????M_srvrSocket.Close();

网络编程具体是学什么内容的

是从网络通信的编程原理和开发基础入手,阐述主机扫描、TCP协议编程、UDP协议编程、远程屏幕监视、木马程序、IP语音网络编程、E-mail协议编程、FTP协议编程、网络信息加密传输和网络信息隐藏通信编程等原理、技术和实现方法。每章都有丰富的程序源代码和实验项目。《普通高等学校应用性人才培养系列规划教材:计算机网络编程技术》以套接字编程为基本路线,力求体现网络编程的技术陛、实用性和安全性,在IP语音网络通信和网络信息隐藏通信等章节,还综合体现了科研成果和技术开发的相关应用,具有一定的先进性。《普通高等学校应用性人才培养系列规划教材:计算机网络编程技术》适合作为高等院校计算机及相关专业学生的教材,也可作为多媒体网络通信和安全编程人员的参考书

网络应用程序设计是指什么?

网络应用程序设计也叫网络编程

通过使用套接字来达到进程间通信目的编程就是网络编程。

代码,开发工具,数据库,服务器架设和网页设计这5部分你都要接触

代码分静态代码和动态代码

静态代码是服务器不解析直接发送给客户端的部分,用做布局效果,一般不用于数据库操作

静态代码分html,javascript,css等,其中html语言是基础,要学网络编程就先学html语言.javascript用于实现某些特效,css是样式语言.这3个语言组合起来,可以设计出美妙的网页效果

动态代码是服务器需要解析的部分,用作数据库连接操作等.有php,jsp,asp和asp.net.这几种语言你只用先学一种就可.如果是想快速入门,建议先学asp,如果想学了找工作等,建议学php或jsp,

开发工具有很多种,我推荐一种,网络3剑客,其中dw是开发代码的,fw是做图的.flash是做动画的.

数据库要结合你学的动态语言来选择,asp和asp.net系列的,你可以使用access,大型点使用mssql.

php和mysql是很好的搭档.

服务器架设也是结合你学的动态语言的,windows下安装iis很方便,iis可以运行asp,安装.net框架后能运行asp.net.这两者架设相对简单,也是我推荐你入门学asp的原因.php一般安装apache服务器,jsp一般安装tomat服务器.只有架设好服务器,才能浏览动态语言编写的程序.

虽然是编程,但是总会涉及到网页设计部分,还是要去学学怎么简单的作图和动画。

原始套接字和普通的TCP套接字有什么不同?

原始套接字可以读写内核没有处理的IP数据包,而流套接字(就是TCP流)只能读取TCP协议的数据,数据包套接字只能读取UDP协议的数据。

这两句程序你就可以创建一个原始套接字.然而这种类型套接字的功能却与TCP或者UDP类型套接字的功能有很大的不同:TCP/UDP类型的套接字只能够访问传输层以及传输层以上的数据,因为当IP层把数据传递给传输层时。

下层的数据包头已经被丢掉了.而原始套接字却可以访问传输层以下的数据,,所以使用raw套接字你可以实现上至应用层的数据操作,也可以实现下至链路层的数据操作.

比如:通过sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))方式创建的raw socket就能直接读取链路层的数据.

1、使用原始套接字时应该注意的问题(参考unix网络编程以及网上的优秀文档)

2、对于UDP/TCP产生的IP数据包,内核不将它传递给任何原始套接字,而只是将这些数据交给对应的

UDP/TCP数据处理句柄(所以,如果你想要通过原始套接字来访问TCP/UDP或者其它类型的数据,调用socket。

socket的中文翻译是套接字,那为什么中文叫套接字呢?我的意思是套接字到底表现了socket的什么特点

Socket原意为孔洞,后来引申为插座,图中Socket在日常中作为插座解释是用来传输电力的;同样,在网络中,作为套接字是用来传输数据的。至于为啥叫套接字,套字新华字典解释本意为罩在外面的东西,引申意有同类事物合成的一组(如:一套制服。套路。套数。套曲。配套),接就是接收,字就是字节网络传输中数据的单位。合起来大概意思就是一套接收数据的方案。

(分析是我瞎掰的,如有雷同,纯属巧合。)

什么是网络编程啊?

网络编程的主要对象就是浏览器 因为我们上网基本上是依赖浏览器的,当然,像游戏,聊天软件等等这些不依赖浏览器,但需要网络协议,不同的协议,有不同的共能,网络编程就是做这些,浏览器:一大堆接口给你摆这了,想做成什么样?自己实现去吧。网络协议:这个跟前面的差不多也有一些接口,或者服务条款等等(嘿嘿,还没研究那么深)然后还是要我们编程人员来实现,我们可以从以上信息中得到它们运行的机制,特点,模式,语言,服务规定等等信息,熟知这些后,我们就可以编程了,利用它自身的东西,在加上我们需要而且符合它规范,且可运行的东西,就是编出来的东西啦~这个就是网络编程啦~HOHO

(责任编辑:IT教学网)

更多

推荐3DMAX教程文章