网络编程之套接字程序实现头歌(udp套接字编程)
如何用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