首页 计算机网络编程

计算机网络编程

举报
开通vip

计算机网络编程 1 1 计算机网络编程 主讲人: 杨巍 wadeyoung@126.com 2 网络编程 „ 网络编程 „ 在计算机网络环境下进行应用程序设计或软 件开发。 „ 狭义的网络编程是指在操作系统上的套接字 (Socket)编程; „ 广义的网络编程泛指网络环境下的一切程序 设计。 „ Socket程序设计 „ 动态网页设计web程序设计 应用层应用层 运输层运输层 网络层网络层 链路层链路层 物理层物理层 3 应用程序的实现结构 „ 客户/服务器工作模式C/S „ 客户 „ 一般为网络用户的计...

计算机网络编程
1 1 计算机网络编程 主讲人: 杨巍 wadeyoung@126.com 2 网络编程 „ 网络编程 „ 在计算机网络环境下进行应用程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 或软 件开发。 „ 狭义的网络编程是指在操作系统上的套接字 (Socket)编程; „ 广义的网络编程泛指网络环境下的一切程序 设计。 „ Socket程序设计 „ 动态网页设计web程序设计 应用层应用层 运输层运输层 网络层网络层 链路层链路层 物理层物理层 3 应用程序的实现结构 „ 客户/服务器工作模式C/S „ 客户 „ 一般为网络用户的计算机; „ 处于主动的地位,可以向服务器发出各种请 求。 „ 服务器 „ 网络上能够提供特定服务的主机; „ 处于被动的地位,根据客户的请求做出相应 的回答,提供相应的服务。 应用层应用层 运输层运输层 网络层网络层 链路层链路层 物理层物理层 应用程序的实现结构 „ Application programs come in pairs, client and server. „ 客户端进程 „ 为用户提供图形用户界面(Graphics User Interface,简称GUI) „ 根据用户输入的数据和命令向服务器发出请求 „ 将服务器作出的回答进行 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 处理、通过GUI提交 用户 „ 服务器端进程 „ 为多个客户机提供服务,实现资源共享 � 提供服务的 应用进程 � 请求通信的客户 应用进程 因 特 网 数据结构 I/O缓冲区 Socket IP,port Socket 数据结构 I/O缓冲区 API API Socket „ 套接字socket „ 最初是由加利福尼亚大学Berkeley分校为UNIX操作 系统开发的网络通信接口。 „ 应用编程接口API称为socketAPI, 简称为 socket。 „ Socket套接字是一种网络编程接口,它定义了一组 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 例行函数,应用程序通过调用这些函数可以和 不同网络中的应用程序进行通信而不必担心网络协 议不同所引发的问题。 „ socket API中使用的一个函数名也叫作socket。 „ 调用socket函数的端点称为socket。 „ 调用socket函数时其返回值称为socket描述符,可 简称为socket。 2 Socket „ Socket套接字适合于TCP/IP、XNS等多种网络 协议。 „ 根据所传输数据类型的不同,套接字可分为面 向连接的流式套接字和无连接的数据报套接 字。 „ 面向连接的流式套接字对应不按定界的数据字节 流,通信双方互相连接,因而它可以保证按正确的 顺序,单一、可靠的传输数据; „ 无连接的数据报套接字由于通信双方无连接,将按 固定的最大长度进行数据传输,它不保证按顺序传 输,并可能出现数据的重复或丢失。 Socket编程 „ 在网络中,应用程序之间如果要进行网络对 话,都需要经过如下的步骤: „ 根据需要建立Socket套接字 „ 根据需要对Socket进行必要的配置 „ 调用具体的Socket函数读写数据 „ 关闭套接字 „ 一个程序将一段信息写入Socket中,该Socket 将这段信息发送给另外一个Socket中,使这段 信息能传送到其他程序中。 Socket编程 „ Berkeley socket 纯C语言的 „ Winsock „ 在Winsock中,通过动态连接库(DLL)实现Socket接口。 „ 动态连接库winsock.dll中包括了Winsock的部分可执行代码, 其余的部分包含在Windows的核心之中。 „ 当应用程序使用Winsock中的函数时,操作系统会加载DLL中 有关的可执行代码模块,以便应用程序使用;但所有的应用程 序都不需要该函数时,操作系统将自动卸掉该部分的可执行 代码模块。大多数的DLL允许多个应用程序同时使用它的内 部可执行代码。 „ Socket类封装了WinSock C++ „ Vb WinSock控件 „ Java Socket 10 server client TCP 11 server client UDP 12 WinSock网络程序设计 主讲人: 杨巍 wadeyoung@126.com 3 13 Windows编程技术 „ 函数是Windows C编程的最基本的单位。 „ Windows C主要使用API函数,而网络编程则 主要使用Winsock提供的API函数。 „ Winsock是90年代初,为了方便网络编程,由 Microsoft联合了其他几家公司共同制定的一套 WINDOWS下的网络编程接口; „ 它是通过C语言的动态链接库方式提供给用户及软 件开发者的,主要由winsock.h头文件和动态链接库 winsock.dll组成,目前有两个版本:Winsock1.1和 Winsock2.0。 14 Winsock编程 „ 用Visual C++6.0编译Windows C程序,使用 Winsock API函数时,首先要把wsock32.lib添 加到它的库模块中,否刚在链接的时候,会出 现“error LNK2001”错误。 „ 添加wsock32.lib的具体步骤是:打开工程菜 单,选择设置,在弹出的Project settings对话 框中,点击link选项卡,然后在对象/库模块文 本框中添加wsock32.lib。 15 Winsock API函数 „ 最简单的网络编程是获取本机的主机名 和IP地址 „ WSAStart() „ WSAClenaup() „ gethostname() 16 WSAStart函数 „ 在使用Winsock函数之前必须成功加载 Winsock库,确保Winsock DLL对 Winsock应用的支持 „ 每一个使用winsock的应用程序,都必须 进行WSAStart函数调用,并且只有在调 用成功之后才能使用其它的winsock网络 操作函数 17 WSAStart函数 int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData); • wVersionRequested用于指定准备加载的Winsock库的版本 • lpWSAData是一个指向WSADATA资料的指针,指向被加载的库版本信息结构 • 返回值:调用成功返回0;否则,返回出错信息。 // Initialize Winsock version 2.2 WSADATA wsaData; int Ret; //WSAStartup(0x0101,&wsaData) if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0) { printf("WSAStartup failed with error %d\n", Ret); return; } 18 WSAClenaup函数 winsock使用后,要调用WSACleanup函数关闭网络设备, 以便释放其占用的资源。 int WSACleanup(void); 4 19 gethostname函数 int gethostname (char * name, int namelen); 该函数可以获取本地主机的主机名,其中: • name:用于指向所获取的主机名的缓冲区的指针。 • Namelen:缓冲区的大小,以字节为单位。 • 返回值:若无错误,返回0;否则,返回错误代吗。 20 流套接字编程 21 编写TCP服务器 „ socket() „ bind() „ listen() „ accept() „ send() „ rev() 22 socket函数 SOCKET socket(int af, int type, int protocol); • af是协议的地址族,通常使用IPv4来描述Winsock时,该字段设置为 AF_INET,表示该socket处于Internet域。 • type是协议的套接字类型 SOCK_STREAM表示使用TCP/IP创建套接字 SOCK_DGRAM表示使用UDP/IP创建套接字 • protocol用于在给定的地址族和套接字类型具有多重入口时,对具体的传 送作限定。 // Create a new socket to listening for client connections. SOCKET ListeningSocket; if ((ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { printf("socket failed with error %d\n", WSAGetLastError()); WSACleanup(); return; } 23 bind函数 „需要使用函数bind将本地地址绑定 到创建的套接字上 int bind( SOCKET s, const struct socaddr* name, int namelen); • s表示被绑定的套接字 • name表示套接字的地址 • namelen表示地址结构的长度 24 SOCKADDR_IN套接字地址 „ 通常会选择SOCKADDR_IN结构来描述套 接字地址,使用的时候再强制转换成 SOCKADDR结构。 struct sockaddr_in { short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; • sin_family要设置为AF_INET • sin_port用来指定服务端口 • sin_addr用来保存IP地址 • sin_zero无实际用处 5 25 SOCKADDR_IN套接字地址 // Associate the address information with the socket using bind. int Port = 5150; SOCKADDR_IN ServerAddr; ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(Port); ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR) { printf("bind failed with error %d\n", WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); return; } 26 listen函数 „ 使用listen函数将套接字置为监听模式, 等候客户端申请连接。 int listen(SOCKET s, int backlog); • s是被绑定的套接字 • backlog标示等待队列的最大长度 // Listen for client connections. We used a backlog of 5. if (listen(ListeningSocket, 5) == SOCKET_ERROR) { printf("listen failed with error %d\n", WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); return; } 27 accept函数 „ 处于监听状态的套接字通过调用accept 函数做好接收客户连接的准备 SOCKET accept(SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen); • s表示处于监听状态的被绑定的套接字 • addr是一个有效的SOCKADDR_IN结构的地址 • addrlen是该结构的长度 28 accept函数 // Accept a new connection when one arrives. SOCKADDR_IN ClientAddr; SOCKET NewConnection; int ClientAddLen; ClientAddrLen = sizeof(ClientAddr); if ((NewConnection = accept(ListeningSocket, (SOCKADDR *) &ClientAddr, &ClientAddrLen) ) == INVALID_SOCKET) { printf("accept failed with error %d\n", WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); return; } 29 send函数 int send (SOCKET s, const char FAR* buf, int len, int flags); • s是即将发送数据的套接字 • buf指向字符缓冲区 • len 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 即将发送的字符数或者缓冲区的大小 • flags通常置0 SOCKET NewConnection; send(s, "Hello", 5, 0) 30 recv函数 int recv(SOCKET s, char FAR*buf, int len, int flags); • s是准备用来接收数据的套接字 • buf指向接收字符的缓冲区 • len记录准备接收的字符数或者缓冲区的大小 • flags通常置0 6 31 closesocket函数 void closesocket(SOCKET s ); 要调用closesocket函数释放Winsock获得的资源, 以便释放其占用的资源。 32 编写TCP客户端 „ socket() „ connect() „ send() „ rev() 33 closesocket函数 void closesocket(SOCKET s ); closesocket和WSACleanup函数释放Winsock获得的资源: 34 connect函数 „ 客户端通过connect向服务进程发出连接 请求 int connect(SOCKET s, struct sockaddr FAR* name, int namelen); • s是一个未连接的套接字 • name标示服务进程的IP地址信息,即服务器 • namelen是name参数的长度 35 数据报套接字编程 „ 编写UDP程序 „ 数据报套接字通过UDP/IP协议提供无连 接的通信,不需要调用listen和accept, 只需要等待接收数据即可。 „ 通常使用recvfrom接收数据,使用 sendto发送数据。 „ 不确保可靠的数据传输。 7 37 编写UDP程序 int sendto ( SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen ); • to指向接收数据的机器的地址 • tolen表示sockaddr结构的长度 int recvfrom ( SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* from, int fromlen ); • from指向发送数据的机器的地址 • fromlen表示sockaddr结构的长度 38 Visual Basic网络程序设计 主讲人: 杨巍 wadeyoung@126.com 39 Visual Basic中的网络控件 „ Visual Basic 6.0中的网络控件 „ WebBrowser „ WinSock „ InternetTransfer „ MAPI „ 控件封装了与Internet有关的技术 40 Visual Basic中的网络控件 „ WebBrowser(Web浏览)控件 „ 用于浏览器的设计 „ WinSock(Windows Socket,Windows接口)控件 „ 提供了访问TCP和UDP网络服务的方便途径 „ Internet Transfer(Internet传输)控件 „ 支持超文本传输协议HTTP和文件传输协议FTP „ MAPI(消息应用程序接口)控件 „ 用于创建具有电子邮件功能的Visual Basic应用程序,消息应 用程序接口包括两个控件 „ MAPISession控件 „ MAPIMessage控件 41 Visual Basic中的网络控件 „ 使用Visual Basic中的网络控件 „ 新建一个“标准.EXE ”工程。 „ 单击“工程”---->“部件”菜单命令,在弹出的 “部件”对话框内的“控件”选项卡中选择 42 WinSock控件 „ WinSock控件 „ Windows Socket是Microsoft对Socket网络编 程接口的集成、简化。 „ Socket指的是一个通信端点,使用Socket开 发的程序可通过网络与远程计算机建立连 接,并通过用户数据报协议UDP或传输控制 协议TCP进行数据交换 8 43 WinSock控件 „ WinSock控件 „ 可用于创建收集用户信息的客户端应用程 序,并将收集的信息发送到某中央服务器 „ 可用于创建服务器应用程序 „ 可用于创建通信应用程序 „ WinSock控件在运行时是不可见的,在设 计时可以像其他ActiveX控件一样添加 44 WinSock控件 „ WinSock控件的常用属性 „ LocalHostName属性 „ 获取本地机器名,在设计时只读且不可用 „ LocalIP属性 „ 获取本地机器的IP地址,在设计时只读且不可用 „ LocalPort属性 „ 返回或者设置所用到的本地端口,可以在设计。运行时进 行设置 „ Protocol属性 „ 返回或设置WinSock控件所使用的协议 „ sckTCPProtocol,0,表示TCP协议 „ sckUDPProtocol,1,表示UDP协议 45 WinSock控件 „ WinSock控件的常用属性 „ RemoteHostIP属性 „ 返回或设置连接的远程计算机,控件向它发送或 接收数据 „ RemotePort属性 „ 获取远程机器的IP地址 „ RemoteHost属性 „ 返回或设置要连接的远程端口号 „ 缺省值是80 46 WinSock控件 „ WinSock控件的常用属性 „ State属性 „ 返回控件的状态,用枚举型来表示,在设计时是 只读的,而且是不可用的 47 WinSock控件 „ WinSock控件的常用方法与事件 „ Bind方法 „ Close方法 „ Listen方法 „ GetData方法 „ PeekData方法 „ 不从输入队列删除数据,仅适用于TCP连接 „ SendData方法 48 WinSock控件 „ WinSock控件的常用方法与事件 „ Close事件 „ ConnectionRequest事件 „ DataArrival事件 „ Error事件 „ SendComplete事件 „ SendProgress事件 9 49 WinSock控件步骤 „ 选择通讯协议 „ 协议的设置 „ 确定计算机的名称 „ 编写应用程序 „ 编写客户端 „ 编写服务器端 50 WinSock控件步骤 „ 选择通讯协议 „ 在使用 WinSock 控件时,首先需要考虑使用什么协 议。 „ 可以使用的协议包括 TCP 和 UDP。两种协议之间 的重要区别在于它们的连接状态: „ TCP 协议控件是基于连接的协议,可以将它同电话系统相 比。在开始数据传输之前,用户必须先建立连接。 „ UDP 协议是一种无连接协议,两台计算机之间的传输类似 于传递邮件:消息从一台计算机发送到另一台计算机,但 是两者之间没有明确的连接。另外,单次传输的最大数据 量取决于具体的网络。 51 WinSock控件步骤 „ 协议的设置 „ 在设计时,可以按如下方式设置应用程序使 用的协议: „ 在“属性”窗口中单击“协议”,然后选择 sckTCPProtocol 或者 sckUDPProtocol „ 也可以使用程序代码来设置 Protocol 属性,如 下所示: Winsock1.Protocol = sckTCPProtocol 52 WinSock控件步骤 „ 确定计算机的名称 „ 在与远程计算机相连接的时候,需要知道它 的 IP 地址或者它的“名字”。 „ IP 地址是一串数字,每三个数字为一组,中 间用点隔开(形如 xxx.xxx.xxx.xxx)。 „ 通常,最易记住的是计算机的“名字”。 53 WinSock控件步骤 „ 编写TCP应用程序 „ 如果应用程序要使用 TCP 协议,那么首先 必须决定应用程序是服务器还是客户端。 „ 如果要创建一个服务器端,那么应用程序需 要“监听”指定的端口。当客户端提出连接请 求时,服务器端能够接受请求并建立连接。 „ 在连接建立之后,客户端与服务器端可以自 由地互相通讯。 54 创建一个 TCP 服务器 „ 要创建一个 TCP 服务器,请按照以下步骤执行 „ 创建新的 Standard EXE 工程。 „ 将缺省窗体的名称改为 frmServer。 „ 将窗体的标题改为“TCP 服务器”。 „ 在窗体中放入一个 Winsock 控件,并将它的名字改 为 tcpServer。 „ 在窗体上添加两个 TextBox 控件。将第一个命名为 txtSendData,第二个为 txtOutput。 „ 为窗体添加代码。 10 Private Sub Form_Load() '将 LocalPort 属性设置为一个整数。 '然后调用 Listen 方法。 tcpServer.LocalPort = 8080 tcpServer.Listen '显示客户端的窗体 frmClient.Show End Sub Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long) '检查控件的 State 属性是否为关闭的。 '如果不是,在接受新的连接之前先关闭此连接。 If tcpServer.State <> sckClosed Then tcpServer.Close '接受具有 requestID 参数的连接。 tcpServer.Accept requestID End Sub Private Sub txtSend_Change() '当用户往文本框中键入数据时,使用 SendData 方法发送输入的字符串。 strSend = txtSend.Text tcpServer.SendData strSend End Sub 56 创建一个 TCP 服务器 Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long) '调用 GetData 方法 '并将数据赋予名为 txtOutput的 TextBox 的 Text 属性。 Dim strData As String tcpServer.GetData strData txtOutput.Text = strData End Sub 57 创建 一个TCP 客户端 „ 要创建 TCP 客户端,请按照以下步骤执行: „ 在工程中添加一个新的窗体,将其命名为 frmClient。 „ 将窗体的标题改为“TCP Client”。 „ 在窗体中添加一个 Winsock 控件,并将其命名为 tcpClient。 „ 在 frmClient 中添加两个 TextBox 控件。将第一 个命名为 txtSend,第二个为 txtOutput。 „ 在窗体上放一个 CommandButton 控件,并将其 命名为 cmdConnect。 „ 将 CommandButton 控件的标题改为 Connect。 „ 为窗体添加代码。 Private Sub Form_Load() '注意:要指定远程主机和主机的端口号 tcpClient.RemoteHost = "127.0.0.1" tcpClient.RemotePort = 8080 End Sub Private Sub cmdConnect_Click() '调用 Connect 方法,初始化连接。 tcpClient.Connect cmdConnect.Enabled = False End Sub Private Sub tcpClient_Connect() MsgBox "连接成功!", vbInformation, "提示" End Sub Private Sub tcpClient_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) MsgBox "连接失败", vbInformation, "提示" cmdConnect.Enabled = True End Sub 59 Private Sub txtSend_Change() Dim strSend As String strSend = txtSend.Text tcpClient.SendData strSend End Sub Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long) Dim strData As String tcpClient.GetData strData txtOutput.Text = strData End Sub 创建 一个TCP 客户端 60 WinSock控件步骤 „ 编写UDP应用程序 „ 创建 UDP 应用程序比创建 TCP 应用程序还要简 单,因为 UDP 协议不需要显式的连接。在上面的 TCP 应用程序中,一个 Winsock 控件必须显式地进 行“监听”,另一个必须使用 Connect 方法初始化连 接。 „ UDP 协议不需要显式的连接。要在两个控件中间发 送数据,需要完成以下的三步(在连接的双方): „ 将 RemoteHost 属性设置为另一台计算机的名称。 „ 将 RemotePort 属性设置为第二个控件的 LocalPort 属 性。 „ 调用 Bind 方法,指定使用的 LocalPort。
本文档为【计算机网络编程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_653526
暂无简介~
格式:pdf
大小:415KB
软件:PDF阅读器
页数:10
分类:互联网
上传时间:2010-11-23
浏览量:55