网络编程与开发技术-课件(综合)_第1页
网络编程与开发技术-课件(综合)_第2页
网络编程与开发技术-课件(综合)_第3页
网络编程与开发技术-课件(综合)_第4页
网络编程与开发技术-课件(综合)_第5页
已阅读5页,还剩191页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络编程与开发技术基于NetBIOS的网络编程动态链接库多线程编程Winsock编程(网络编程)Winsock基础WinsockI/O方法第2章基于NetBIOS的网络编程2/1/20232-1NetBIOS的基本概念2-2NetBIOS概述2-3NetBIOS命令2-4NetBIOS编程2-1NetBIOS的基本概念NetBIOS是NetworkBasicInput/OutputSystem的简称NetBIOS是一个网络协议。一般指用于局域网通信的一套API(ApplicationProgrammingInterface)。随着PC-Network被令牌环和以太网取代,NetBIOS也应该退出历史舞台。但是,由于很多软件使用了NetBIOS的API,所以NetBIOS被适配到了各种其他的协议上,比如IPX/SPX和TCP/IP。NetBEUINetBEUI即NetBiosEnhancedUserInterface,或NetBios增强用户接口。NetBEUI是NetBIOS协议的增强版本,曾被许多操作系统采用。三种协议的对比

局域网常用的三种通信协议分别是TCP/IP协议、NetBEUI协议(上世纪80年代早期由IBM开发,用于所谓的PC-Network)和IPX/SPX协议(Novell开发的专用于NetWare网络中的协议)。2-2NetBIOS概述(1)不管使用哪一种传输方式,NetBIOS提供三种不同的服务:名字服务:名字登记和解析会话服务:可靠的基于连接的通信数据包服务:不可靠的无连接通信(2)NetBIOS支持面向连接和无连接通信。(2)NetBIOS和NetBEUI被设计为仅仅用于局域网,因此不支持路由。名字管理命令NCBADDNAMENCBADDGRNAMENCBDELNAME数据报通讯命令NCBDGSENDNCBDGRECV(NCBDGSENDBC)(NCBDGRECVBC)2-3NetBIOS命令

NCBADDNAMEUCHARAddName(UCHAR*Name,UCHAR*NameNum){ NCBncb;memset(&ncb,0,sizeof(NCB));ncb.ncb_command=NCBADDNAME;ncb.ncb_lala_num=0;strcpy(ncb.ncb_name,Name);Netbios(&ncb);*NameNum=ncb.ncb_num;return(ncb.ncb_cmd_cplt);

}NCBDGSENDUCHARDatagramSend(PNCBpncb,UCHARDestName[],UCHARNum,UCHAR*pBuffer,WORDLength){ memset(pncb,0,sizeof(NCB));pncb->ncb_command=NCBDGSEND;

strcpy(pncb->ncb_callname,DestName);pncb->ncb_num=Num;pncb->ncb_buffer=pBuffer;pncb->ncb_length=Length;Netbios(&ncb);}会话通信命令NCBCALLNCBLISTENNCBSENDNCBRECV和NCBRECVANYNCBHANGUP控制和测试命令NCBRESETNCBCANCEL(NCBUNLINK)NCBSSTATNCBASRAT2-4NetBIOS编程初始化程序 P33加名字与删除名字 P35数据报通信程序 P38会话通信模型 P49*数据报通信程序将数据发送到一个特定的唯一名;将数据发送到一个组名;将数据广播到整个网络;基于NetBIOS的数据报通信模型*数据报通信程序基于NetBIOS的会话通信模型*会话通信模型*两种NetBios会话服务器编程模型会话服务器:异步回调模型会话服务器:异步事件模型●异步回调模型程序清单Cbnbsvr.c中,展示了具体的服务器代码,其中利用的是异步回调函数。●●异步事件模型事件模型与回调模型相似,唯一的区别在于对回调模型来说,系统会在异步操作完成后执行用户自定义的代码;而对事件模型来说,程序必须通过对事件状态的检查,来核实操作是否完成。由于这些属于标准的Win32事件,所以可在此选用任何同步例程,比如WaitForSingleEvent和WaitForMultipleEvents等等。事件模型显得更有效率,因为程序员必须为程序规定一个恰当的结构,有意检查完成与否。本章小节本章目的要求:熟悉NetBios网络编程接口。学会使用NetBios创建C/S结构简单的网络通讯程序。(重点)学会使用两种NetBios服务器编程模型--回调函数或事件模型。(难点)实验内容:使用NetBios编程接口编写一个面向连接的回调模型服务器或者事件模型服务器。要求编写客户机测试,客户机可以和服务器对话。可以使用控制台字符界面。服务器可以依次和多个用户对话。第6章动态链接库2/1/20236-1 动态链接库的基本概念6-2 动态链接库的优点6-3 动态链接库的创建和使用6-1 动态链接库的基本概念动态链接库(Dynamic-LinkLibrary,简称DLL)一些简单相关概念自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着。显示的字体和图标存储在GDI.DLL中显示Windows桌面和处理用户的输入所需要的代码被存储在一个User.DLL中Windows编程所需要的大量的API函数也被包含在Kernel.DLL中

动态链接库(DLLs)是从C语言函数库和Pascal库单元的概念发展而来的。几乎所有的WindowsAPI都包含在DLL中6-2 DLL的优点大工程可分为易管理的小工程与具体的编程语言无关,所以不同程序设计语言之间可以共享DLL实现新功能更容易、软件升级减少可执行代码大小重用代码,避免重新开发,提高软件开发的效率和质量共享DLL,节省内存,减少动态交换6-2 DLL的优点DLL可在函数调用其中的函数时,才被装入内存DLL在内存中的一个副本可供多个应用程序使用减少了内存和磁盘空间DLL是包含若干函数、类或资源的库文件在动态库的情况下,有两个文件引入库(.LIB)文件DLL文件引入库文件包含被DLL导出的函数的名称和位置DLL包含实际的函数和数据应用程序使用LIB文件链接到所需要使用的DLL文件6-3 动态链接库的创建和使用微软的VisualC++支持三种DLLNon-MFC Dll (非MFC动态链接库)Regular Dll (常规DLL)Extension Dll (扩展DLL)

6-3-1 非MFC动态链接库第一步:在VC++中新建一个Win32Dynamic-LinkLibrary工程,本例取名为MyDll。注意不要选择MFCAppWizard(dll),因为用MFCAppWizard(dll)建立的将是后面要讲述的MFC动态链接库。▲Dll文件的创建例子6-3-1 非MFC动态链接库删掉多余部分,留下

BOOLAPIENTRYDllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch(ul_reason_for_call) { caseDLL_PROCESS_ATTACH: caseDLL_THREAD_ATTACH: caseDLL_THREAD_DETACH: caseDLL_PROCESS_DETACH: break; } returnTRUE; }6-3-1 非MFC动态链接库intadd(intx,inty){returnx+y;}在建立的工程中添加代码,如下:6-3-1 非MFC动态链接库第二步:声明导出函数。采用模块定义(.def)文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。在dllTest工程中添加MyDll.def文件:/*文件名MyDll.def*/EXPORTS add▲Dll文件的创建例子6-3-1 非MFC动态链接库6-3-1 非MFC动态链接库第三步:文件建立完毕后进行编译,得到dll文件。查看Debug目录,生成了两个文件MyDLL.dllMyDLL.lib6-3-1 非MFC动态链接库建立一个新的应用工程,本例取名为CallDll,它调用MyDLL中的函数add,其源代码如下:▲Dll文件的调用例子6-3-1 非MFC动态链接库#include"stdafx.h"#include<stdio.h>#include<windows.h>typedefint(*lpAddFun)(int,int); //宏定义函数指针类型intmain(intargc,char*argv[]){ HINSTANCEhDll; //DLL句柄 lpAddFunaddFun; //函数指针 hDll=LoadLibrary("MyDll.dll");

if(hDll==NULL) { printf("cannotfindtheDLL!\n"); return0;} addFun=(lpAddFun)GetProcAddress(hDll,"add"); if(addFun==NULL) { printf("获取函数地址失败!");return0;}

intresult=addFun(7,3); printf("therusultis%d\n",result); FreeLibrary(hDll); return0;}语句typedefint(*lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;其次,在函数main中定义了一个DLLHINSTANCE句柄实例hDll,通过Win32Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;再次,在函数main中通过Win32Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;最后,应用工程使用完DLL后,在函数main中通过Win32Api函数FreeLibrary释放了已经加载的DLL模块。6-3-1 非MFC动态链接库第二步:将前面得到的“.dll”文件,拷贝到本工程所在的路径,然后再编译本项目文件,进行调用测试。6-3-1 非MFC动态链接库这样,我们完成了非MFC的DLL文件的创建和调用DLL的两种链接方式DLL的显示链接DLL的隐式链接6-3-1 非MFC动态链接库跟显式链接相关的函数HINSTANCELoadLibrary(LPCTSTRlpLibFileName);

FARPROCGetProcAddress(HMODULEhModule,LPCSTRlpProcName);

BOOLFreeLibrary(HMODULEhLibModule);使用显式链接应用程序编译时不需要使用相应的Lib文件关键字typedef,定义指向和DLL中相同的函数原型指针DLL的显式链接#include"stdafx.h"#include<stdio.h>#include<windows.h>#include"CallDll2.h"#pragmacomment(lib,"MyDll.lib")_declspec(dllimport)intMyAdd(inta,intb);

intmain(intargc,char*argv[]){ intresult=MyAdd(128,32); printf("therusultis%d\n",result); return0;}DLL的隐式链接显示连接指知道函数的原型,定义一个函数指针后,用LoadLibrary和GetProcAddress函数取函数的地址的方法。隐式链接指已经包含了函数的.h文件,直接引用函数,在连接的时候将.lib文件连接进去。隐式链接后,exe程序一加载,Windows自动在先查找exe文件当前目录有没有dll,如果没有则按搜索路径查找,如果搜索路径也没有则会弹出对话框报错,提示找不到dll文件。而显示链接在LoadLibrary函数返回的句柄为NULL,则说明找不到dll,否则就是dll文件加载进内存的句柄。

DLL的显式链接和隐式链接的区别显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。实现显式链接要麻烦一些。DLL的显式链接和隐式链接的区别要先将MyDll.dll和MyDll.lib拷贝到某目录下面Windows系统将遵循下面的搜索顺序来定位DLL:1.包含EXE文件的目录2.进程的当前工作目录3.Windows系统目录4.Windows目录5.列在Path环境变量中的一系列目录

DLL的隐式链接中的路径问题MFC规则DLL的创建

6-3-2 MFC动态链接库

1使用MFC向导创建MFC规则DLL。首先新建一个Project,选择project的类型为MFCAppWizard(dll)。取生成的.dll文件为MyMFCDll.dll。2新建对话框资源,并关联类名为CMainDlg 可以在对话框的Hello按钮上点击时加入对话框: MessageBox("Hello,四川师范大学的同学们");3在模版定义文件中(.def)添加如下代码: EXPORTS;Explicitexportscangohere ShowDlg6-3-2 MFC动态链接库4在程序的cpp中添加:

#include"MainDlg.h"

voidShowDlg(){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); CMainDlgdllDialog; dllDialog.DoModal();}5编译成功,生成MyMFCDll.dll文件显示调用:编写如图对话框MFC程序来调用,前面生成的MFC规则DLL中的对话框。MFC规则DLL的调用

下面是“显式调用DLL”按钮单击事件的消息处理函数:voidCCallMFCDllDlg::OnButton1(){ typedefvoid(*lpFun)(void); HINSTANCEhDll;//DLL句柄 hDll=LoadLibrary("RegularDll.dll"); if(NULL==hDll) { MessageBox("DLL加载失败"); return; } lpFunaddFun;//函数指针 lpFunpShowDlg=(lpFun)GetProcAddress(hDll,"ShowDlg"); if(NULL==pShowDlg) { MessageBox("DLL中函数寻找失败"); return; } pShowDlg();}隐式调用MFC规则DLL: #pragmacomment(lib,"MyMFCDll.lib") voidShowDlg(void); voidCRegularDllCallDlg::OnCalldllButton() { ShowDlg(); }本章小节DLL的概述DLL的创建DLL的使用掌握DLL的创建方法。熟悉调用DLL的两种方式。重点:掌握DLL的隐式链接难点:DLL的显示链接与DLL的创建。第5章多线程2/1/20235-1 线程的创建5-2 线程同步同步问题资源竞争问题5-1多线程概念程序Program进程Process线程Thread5-1多线程概念线程是一个独立的执行流,是进程内部的一个独立的执行单元,相当于一个子程序。一个进程中的所有线程都在该进程的虚拟地址空间中,共享该进程的全局变量和系统资源。线程是比进程更小的执行单元,CPU的调度与时间分配皆以线程为对象。5-1-2线程的创建HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,

//描述这以新线程的安全属性。NULL表示使用缺省值。

DWORDdwStackSize,//新线程拥有自己的堆栈。0表示使用缺省大小。LPTHREAD_START_ROUTINElpStartAddress,//新线程将开始的起始地址。这是一个函数指针。所以这里可以放一个函数名称。 LPVOIDlpParameter,//将值将被传送到上述指定的新线程函数去,作为参数。DWORDdwCreationFlags,//允许产生一个暂时挂起的线程。默认情况是“立刻开始执行”LPDWORDlpThreadId //新线程的ID会被传回到这里。

);如果CreateThread()成功,传回一个handle,代表新线程。否则传回一个FALSE,如果失败。可以调用GetLastError()获知原因。5-1-3线程的恢复DWORDResumeThread(

HANDLEhThread

//被激活线程的句柄

);

5-1-4线程的挂起DWORDSuspendThread(

HANDLEhThread

//handletothethread

);5-1-5线程的终止VOIDExitThread(DWORDdwExitCode

//exitcodeforthisthread

);

HANDLEGetCurrentProcess(VOID)

BOOLTerminateThread(HANDLEhThread,

//handletothethread

DWORDdwExitCode

//exitcodeforthethread

);GetExitCodeTread();

DWORD exitCode=0; HANDLE myThread; myThread=CreatThread(NULL,0,ThreadFunc,(LPVOID)1,0, &threadId); for(;;) { GetExitCodeTread(myThread,&exitCode); if(&exitCode!=STILL_ACTIVE) break; }5-2线程同步进程中的所有线程共享进程的虚拟地址空间,这意味着所有线程都可以访问进程的资源空间。线程共享一方面为编程带来了方便,但也容易造成访问冲突。线程同步,是为了协调多个线程的执行,保证数据完整性而采取的措施。5-2-1等待函数等待函数是一组能使线程阻塞其自身执行的函数。这些函数只有在一个或多个特定的同步对象产生信号时才会返回。等待函数即可以保证线程的同步,又可以提高程序的运行效率。WaitForSingleObjectWaitForMultipleObjects5-2-1等待函数WaitForSingleObjectWaitForSingleObject

DWORD exitCode=0; HANDLE myThread; myThread=CreatThread(NULL,0,ThreadFunc,(LPVOID)1,0, &threadId); for(;;) { GetExitCodeTread(myThread,&exitCode); if(&exitCode!=STILL_ACTIVE) break; }WaitForSingleObject(hThread,0)WaitForSingleObject可被WaitForSingleObject()使用的核心对象有两种状态:激发与未激发.WaitForSingleObject()会在目标物变成激发状态时返回。当核心对象被激发时,会导致WaitForSingleObject()醒来。当线程结束时,线程对象即被激发;当线程还在进行时候,则对象处于未激发状态。WaitForMultipleObjectsWaitForMultipleObjects允许在同一时间等待一个以上的对象。必须将一个由handles组成的数组交给此函数,并指定要等待其中一个对象或者使全部的对象。同步控制问题线程同步是通过同步对象而实现。同步对象是一个数据结构,用来协调多线程的执行,它可以被多个线程共享。同步对象主要有四种:临界区互斥量信号量事件对象5-2-2临界区(criticalsection)临界区是保证在同一时间只有一个线程可以访问数据的方法。临界区对象与互斥量对象相似,但只能被同一进程中的线程使用。5-2-2 (1)创建临界区5-2-2 (2)删除临界区例子下面是一个基本例子,用来产生、摧毁一个criticalsection。5-2-2 (3)进入临界区一旦criticalsection被初始化,每一个线程就可以进入其中——只要它通过了EnterCriticalSection()这一关。5-2-2 (4)离开临界区一个建议:不用长时间锁住一份资源。如果你一直让资源被锁定,你也许会阻止其它线程的执行,并把整个程序带入一个完全停止的状态。以CriticalSection来说,当某个线程进入CriticalSeciton时,该资源即被锁定。5-2-3互斥量互斥量对象主要用于防止同时访问一个共享资源(一个时间只能够有一个线程拥有mutex,就好像同一时间只能够有一个线程进入同一个criticalsection一样。)互斥量,可以命名的。也就是说,它可以跨越进程使用,所以创建互斥量需要的资源更多。互斥量与临界区的比较互斥量与临界区的比较5-2-3 (1)创建互斥量例子OpenMutexCloseHandle5-2-3 (2)打开、关闭一个互斥量5-2-4 (3)释放互斥量的使用权ReleaseMutex如何锁住一个互斥量5-2-4信号量信号量对象主要通过计数来限制对共享资源的访问量。5-2-4(1)创建信号量5-2-4(2)打开、关闭信号量OpenSemaphoreCloseHandle5-2-4(3)释放信号量如何锁住一个信号量5-2-5事件对象事件对象主要用于通知其它等待线程某事件已经发生。5-2-5(1)创建事件对象5-2-5(2)打开、关闭事件对象OpenEventCloseHandle5-2-5(3)设置事件对象SetEvent设置事件为有信号状态(激活状态)ResetEvent设置事件为无信号状态(非激活状态)5-2-6同步机制摘要第3章Winsock编程--Winsock编程基础2/1/2023本章主要内容SOCKET简介基于WINDOWSSOCKET的应用开发介绍WINSOCKAPI主要函数简介聊天应用程序的设计说明服务器端客户端3-1-1 TCP/IP发展简介TCP/IP是发展至今最成功的通信协议之一。开放目的是允许将分布在各地的装着完全布同的操作系统的计算机互相通信。80年代初,美国政府的高级研究工程机构(ARPA)给加利福尼亚大学Berkeley分校提供了资金,让他们在UNIX操作系统下实现TCP/IP协议。3-1-1 TCP/IP发展简介1983年,互联网的前身Arpanet中,TCP/IP协议取代了旧的网络核心协议NCP(NetworkCoreProtocol),从而成为今天的互联网的基石。3-1-2Socket的发展研究人员为TCP/IP网络通信开发了一个API。这个API称为Socket接口(套接字)。早期的TCP/IP协议开发接口是UNIX操作系统下的Socket。随着UNIX操作系统的广泛使用,Socket成为当前最流行的网络通信应用程序接口之一。Winsock是从UNIX系统的Socket接口演变而来的。3-1-2Socket的发展90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范。从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准。3-1-2Socket的发展在实际应用中的WINDOWSSOKCETS规范主要有1.1版和2.2版。两者的最重要区别是1.1版只支持TCP/IP协议,而2.2版可以支持多协议。SOCKET实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有SOCKET接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个SOCKET接口来实现。在应用开发中就像使用文件句柄一样,可以对SOCKET句柄进行读写操作。3-1-3Winsock版本 平台 Winsock版本Windows95 1.1(2.2)Windows98 2.2WindowsNT4.0 2.2Windows2000 2.23-1-4基于WINDOWSSOCKET的应用开发介绍

在WINDOWS系统中进行WINSOCK开发使用的编程语言有很多,VC++,JAVA,DELPHI,VB等。VC++用得较多,跟WinSocket联系最紧密3-1-5 TCP/IP成功的因素TCP/IP成功的另一个因素在与对为数众多的低层协议的支持。这些低层协议对应与OSI模型中的第一层(物理层)和第二层(数据链路层)。每层的所有协议几乎都有一半数量的支持TCP/IP,例如:以太网(Ethernet),令牌环(TokenRing),光纤数据分布接口(FDDI),端对端协议(PPP),X.25,帧中继(FrameRelay),ATM,Sonet,SDH等。3-1-5 TCP/IP成功的因素TCP/IP技术的发展设计目标——实现异种网的网际互连是最早出现的系统化的网络体系结构之一顺应了技术发展网络互连的应用需求采用了开放策略与最流行的UNIX操作系统相结合3-2-1 TCP/IP的重要性连接不同系统的技术开放系统。与Internet连接:节省资金提供强有力的WAN连接:可路由,为广域网设计的3-2-2计算机网络的原理体系结构虚通信实通信物理介质

OSI七层结构物理层网络层数据链路层会话层传输层应用层表示层特点:

概念清晰复杂、不实用3-2-2计算机网络的原理体系结构报文网际互连层网络接口层传输层应用层网际互连层网络接口层传输层应用层分组数据报帧物理网络TCP/IP层次模型特点:事实上的标准没有完整的体系结构3-2-3TCP/IP协议族英文全称:TransmissionControlProtocol/InternetProtocol中文全称:传输控制协议/互联网协议TCP/IP实际上是一族协议,不是单一的协议。3-2-4TCP/IP协议族的体系结构TCP/IP是一个四层协议。链路层:也被称为数据链路层或网络接口层。通常包括操作系统中的设备驱动程序、计算机中对应的网络接口卡,处理与电缆(或其他任何传输媒介)的物理接口细节。该层包括的协议有:ARP(AddressResolutionProtocol,地址转换协议)、RARP(ReverseAddressResolutionProtocol,反向地址转换协议)3-2-4TCP/IP协议族的体系结构网络层又叫互联网层。负责报文分组在网络中的活动。包括协议有:IP协议(网际协议)ICMP(Internet互联网控制报文协议)IGMP(Internet组管理协议)3-2-4TCP/IP协议族的体系结构传输层该层主要为两台主机上的应用程序提供端到端的数据通信。它分为两个不同的协议:TCP(TransportControlProtocol,传输控制协议)UDP(UserDatagramProtocol,用户数据报协议)TCP协议提供端到端的质量得到保证的数据传输,该层负责数据的分组、质量控制和超时重发等。UDP协议只提供简单的把数据报从一端发送到另一端,至于数据是否到达,数据是否损坏必须由应用层来做。3-2-4TCP/IP协议族的体系结构应用层该层负责处理实际的应用程序细节;包括Telnet(远程登录)HTTP(WorldWideWeb服务)SMTP(SimpleMailTransferProtocol,简单邮件传输协议)FTP(FileTransferProtocol,简单文件传输协议)SNMP(SimpleNetworkManagementProtocol,简单网络管理协议)3-2-4TCP/IP协议族的体系结构ApplicationPresentationSessionTransportNetworkDatalinkPhysicalTCPUDPIPICMPIGMPARPRARPProtocolsdefinedbytheunderlyingnetworksSMTPFTPTELNETDNSSNMPNFSRPCTFTPApplications3-2-5数据如何传输3-2-5数据如何传输通讯实际上是按垂直方向进行的,但在逻辑上通信是在同级进行的3-3 协议简介IP层的IP协议TCP层的TCP、UDP协议3-3-1IP协议的功能寻址路由选择分段与组装TCP/IP的重要思想之一就是通过各种IP数据报和IP地址将它们统一起来,屏蔽低层细节,提供一致性。3-3-1IP地址格式:在Ipv4中,IP地址一般采用点分十进制。如:二进制格式:10000001.00110100.00000110.00000000IP地址的分类TCP/IP分类寻址和IP地址的分类IP地址长度为32bit,包括网络号(网络前缀)和主机号不同的地址类型定义了地址中网络前缀和主机号所占的位数利用地址类型,可快速区分出地址中的网络前缀和主机号组播(Multicast)地址101保留使用101111D类E类主机号网络前缀241680主机号网络前缀10主机号网络前缀10115233101234567C类B类A类路由器和多穴主机的IP地址一类特殊的结点:具有多个物理接口、连接到多个网络上路由器、多穴主机(multi-homedhost)该结点同时属于它所连接的多个网络对应于结点所连接的每一个网络,给该结点分配一个IP地址结点具有多少网络连接就拥有多少IP地址可见,IP地址实际上是对结点上网络连接的标识网络1/8网络2/24主机接口A接口B特殊的IP地址直接广播地址(broadcastaddress)主机号全1的IP地址向指定的网络进行广播。有限广播地址(limitedbroadcastaddress)32位IP地址位全1(即55)表示用于在本网络中广播的有限广播地址。0地址IP地址中主机地址为0的地址表示网络地址,如:回送地址(loopbackaddress)网络号为127的A类地址(如)用于本地软件测试(测试应用层与网络软件之间的进程间通信)IP地址是进行选路依据选路(Routing)的概念根据分组目的地址,寻找一条能将分组从信源主机转发到目的主机的通路的过程。选路是依据IP地址进行的选路使用的数据结构是路由表(转发信息库-FIB)IP协议每发送(转发)一个分组,都要利用路由表来选路。路由表的概念结构目的地址D1去往D1的路径目的地址D2去往D2的路径目的地址D3去往D3的路径目的网络N1去N1的路径(next-hop)目的网络N2去N2的路径(next-hop)目的网络N3去N3的路径(next-hop)TCP/IP的地址解析IP地址到物理地址的映射TCP/IP的地址解析地址解析的含义实现IP地址与网络物理地址的映射实现地址解析的意义Internet是由多个网络互连构成的“虚拟”网络,采用统一的IP地址进行结点间(网络间)的相互通信IP地址统一了网际通信的地址形式(IP层以上的软件都使用IP地址),隐藏了原有的物理网络地址但在网络内部,IP层通信的实现依赖于底层的物理网络技术,底层必然还要使用物理地址为了保证通信的一致性,必须要建立各结点IP地址与网络物理地址之间的映射,称为地址解析(resolution)。TCP/IP的地址解析地址解析的两个方向根据IP地址获得物理地址根据物理地址获得IP地址的相应地,TCP/IP中定义了两个解析协议:地址解析协议(ARP–AddressResolutionProtocol)用于IP地址到物理地址的映射逆向地址解析协议(RARP–ReverseAddressResolutionProtocol)用于物理地址到IP地址的映射地址解析在协议栈中的位置地址解析是在物理地址上加的一层地址机制,通常被看作是IP层以下的功能,可认为是物理网络的一部分。地址解析(IP地址->物理地址)固定表格法事先在各主机中建立IP地址与物理地址的转换表。直接映射法物理地址是可配置的,物理地址可以直接作为IP地址的一部分(例如作为主机号),进行地址解析时直接可从IP地址得到其物理地址。动态绑定法(Dynamicbinding)对于以太网等具有广播功能的网络技术,TCP/IP设计了一种动态绑定的地址解析技术,并制定的标准的协议,即ARP协议。从理论上计算全部32位都用上可以允许有232超过四十亿的地址!这几乎可以为地球三分之二的人提供一个地址。但事实上,随着Internet的发展,可用的IP地址已经快要用完了。在将来的Ipv6中,IP地址由十六个八位域组成,共128位二进制形式的IP地址组成,还是用点号每八位一分割,在现在看来是足够了,但不知道还会有什么意想不到的事情令IP地址又不够用了。IP数据报格式3-4TCP协议的功能保证传输的可靠性

提供部分应用层信息的功能

TCP段格式20~60bytes3-6WINSOCKAPI主要函数简介WSAStartupWSACleanupsocketclosesocketbindlistenacceptconnectrecv recvfromsendsendtoWinsock初始化函数3-6WINSOCKAPI主要函数简介WSAStartup()连结应用程序与WindowsSocketsDLL的第一个函数此函数是应用程序调用WindowsSocketsDLL函数中的第一个,此函数调用成功后,才可以再调用其他WindowsSocketsDLL的函数。intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);

wVersionRequested是WinSocketAPI提供的调用方可使用的最高版本号,高字节是副版本号,低字节是主版本号lpWSAData是指向WSADATA的指针,用来接收Socket的实现细节….//初始化套接字WSADATA WSAData;WSAStartup(MAKEWORD(2,2),&WSAData)…补充-MAKEWORD函数宏MAKEWORD,将高八位和低八位组合成一个word。inlinewordMAKEWORD(constbytewHigh,constbytewLow)

{

return((word)wHigh)<<8|wLow;

}BYTE

hb

在内存里面

11

BYTE

lb

在内存里面

22WORD

dw

=

MAKEWORD(hb,

lb);

在内存里面为:

11

22

因此MAKEWORD(2,1)实际等同于0x0201。同样地,0x0101可等同于MAKEWORD(1,1)。WSACleanup()结束WindowsSocketsDLL的使用当应用程序不再需要使用WindowsSocketsDLL时,须调用此函数来注销使用,以便释放其占用的资源。intWSACleanup();基本Winsock函数3-6WINSOCKAPI主要函数简介socket()SOCKETsocket(intaf,inttype,intprotocol);

af一般取为AF_INET,表示互联网协议组type,套接字的类型SOCK_STREAM(会话套接字)SOCK_DGRAM(数据包套接字)SOCK_RAW(原始套接字)SOCK_SEQPACKET(顺序数据包

)SOCK_RDM(提供可信赖的数据包连接

)protocol,套接字所使用的协议一般取0,表示默认为TCP/IP协议bind()intbind(SOCKETs,conststructsockaddr*name,intnamelen);

一旦为某种特定协议创建了套接字,就必须将套接字绑定到一个已知地址。bind函数可将指定的套接字同一个已知地址绑定到一起。s:标识一未绑定套接字的句柄。name:指向与协议有关的地址结构的指针。该结构称为套接字地址结构。该结构的类型是Slen:代表name指向的地址结构的长度。structsockaddr{u_short sa_family;char sa_data[14];};structsockaddr_in{short sin_family;u_short sin_port;struct in_addr sin_addr;char sin_zero[8];};sin_family字段必须设为AF_INET,表示该socket处于Internet域。sin_port字段用于指定服务器端口。sin_addr字段用于把一个IP地址保存为一个4字节的数函数inet_addr可以把点分式IP地址转换为一个32位无符合长整数。sin_zero只当填充项的作用。下面看一个例子在TCP连接上进行套接字绑定示例listen()intlisten(SOCKETs,intbacklog);

s:标识一个已经绑定但未连接套接字的句柄。backlog:表示等待连接队列的最大长度。功能:将套接字设置为侦听模式,等待客户端提出的连接申请。accept()SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);

功能:在指定的套接字上接受一个连接。服务器接收客户的连接请求,在建立好输入队列以后,服务器就调用accept,然后进入休眠状态,等待用户的连接请求S:套接字句柄,该套接字在listen()后已经侦听连接addr:连接请求方SOCKADDR_IN结构的地址。addrlen:SOCKADDR_IN结构长度。accept()的调用过程示例SOCKETsServSock;sockaddr_inaddr;intnSockErr;intnNumConns[5];sockaddrConnaddrs[5];intnAddrLen=sizeof(sockaddr);//建立socket对象sServSock=socket(AF_INET,SOCK_STREAM,0);//为socket分配端口addr.sin_family=AF_INET;addr.sin_port=htons(5050);addr.sin_addr.s_s_addr=htonl(INADDR_ANY);if(bind(sServSock,(LPSOCKADDR)&addr,sizeof(addr))==SOCKET_ERROR){ nSockErr=WSAGetLastError();}//侦听客户连接的请求if(listen(sServSock,2)==SOCKET_ERROR){ nSockErr=WSAGetLastError(); //处理错误,不再继续}while(nNumconns<5){ //接受连接 sConns[nNumConns]=accept(sServSock,ConnAddrs[nNumConns],&nAddrLen);if(sConns[nNumConns]==INVALID_SOCKET) { nSockErr=WSAGetLastError(); } else { StartNewHandleThread(sConns[nNumConns]); nNumConns++; }}connect()intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);

用于建立与一个服务器端的连接。当连接建立完成后,客户端即可利用此Socket来与服务端进行信息传递。closesocket()intclosesocket(SOCKETs);

shutdown()intclosesocket(SOCKETs,inthow);

Winsock中数据传输函数3-6WINSOCKAPI主要函数简介sendintsend(SOCKETs,constcharFAR*buf,intlen,intflags);功能:向一个已连接的套接字发送数据sendsendtointsend(SOCKETs,constcharFAR*buf,intlen,intflags);功能:向一个已连接的套接字发送数据intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen);

功能:向一指定目的地发送数据recv recvfromintrecv(SOCKETs,charFAR*buf,intlen,intflags);

功能:从已建立连接的套接字接收数据。intrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,structsockaddrFAR*from,intFAR*fromlen);

功能:接收一个数据报并保存发送方地址结构信息。字节顺序及地址转换函数3-6WINSOCKAPI主要函数简介(1)字节顺序转换函数功能:把一个数从主机字节顺序转换为网络字节顺序。u_long htonl (u_longhostlong);int WSAHtonl (SOCKETs,u_longhostlong,u_longFAR*lpnetlong);u_short htons (u_shorthostshort);int WSAHtons (SOCKETs,u_shorthostshort,u_shortFAR*lpnetshort);(1)字节顺序转换函数功能:把网络字节顺序转换为主机字节顺序。u_long ntoh(u_longnetlong);int WSANtohl(SOCKETs,u_longnetlong,u_longFAR*lphostlong);u_short ntohs (u_shortnetshort);int WSANtohs (SOCKETs,u_shortnetlong,u_shortFAR*lphostlong);(2)地址转换函数功能:把网络字节顺序转换为主机字节顺序。unsignedlonginet_addr(constcharFAR*cp);将点分式IP地址转换为一个32位的无符号长整数。cp是一个以Internet标准“.”间隔的IP地址字符串。这个函数的返回是一个网络字节顺序的32位长整数。char*inet_ntoa(structint_addrinaddr);inet_ntoa()将32位无符号长整型转换为点分式IP地址。网络信息查询函数3-6WINSOCKAPI主要函数简介(1)getpeername功能:获取通信对方的套接字地址结构信息。

intPASCALFARgetpeername(SOCKETs,structsockaddrFAR*name,intFAR*namelen);s:已连接的套接字。name:通信对方的套接字地址结构。namelen:一个指向地址结构长度的指针。(2)getsockname功能:该函数是getpeer的对应函数。获取指定套接字的本地地址结构信息。

intPASCALFARgetsockname(SOCKETs,structsockaddrFAR*name,

intFAR*namelen);s:标识一个已绑定套接字的句柄。name:套接字的地址结构。namelen:一个指向地址结构长度的指针。(3)gethostbyname功能:返回对应于给定主机名的主机信息。在已知主机名而打算查找其IP地址的时候,可以使用这个函数。

structhostentFARgethostbyname(c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论