2024年5月1日发(作者:)

第3章 网络应用

3.1 网络编程基础

多媒体技术与网络技术的结合,使得网络生活变得多姿多彩。从此,网络生活很迷

人;网络改变了和改变着人们原本的生活方式。姑且认为DirectShow是单机的多媒体技

术,一旦融合了网络技术,DirectShow更显现了它强大的生命力。本章将着重介绍

DirectShow技术在网络方面的应用。

网络编程,当然要用到Windows Socket(套接字)技术。Socket相关的操作由一系列

API函数来完成,比如socket、bind、listen、connect、accept、send、sendto、recv、

recvfrom等。调用这些API函数有一定的先后次序,有些函数的参数还比较复杂,对于开

发者来说,不是很好用。于是,微软的MFC提供了两个类:CAsyncSocket和CSocket,极

大地方便了Socket功能的使用。这两个类的继承关系如图3.1。

CObject

CAsyncSocket

CSocket

图3.1 MFC Socket类的继承关系

CAsyncSocket类在较低层次上封装了Windows Socket API,并且通过内建一个(隐藏

的)窗口,实现了适合Windows应用的异步机制(Windows Socket API默认情况下工作在

阻塞模式,不方便直接在消息驱动的Windows程序上使用)。CSocket类从CAsyncSocket

类派生,进一步简化了Socket功能的应用。不过很遗憾,正因为这两个类都内建了一个窗

口,它们并不是线程安全的(thread-safe);如果要在多线程环境下应用Socket功能,

建议自行封装Socket API函数。

使用Socket传输数据主要有两种方式:TCP传输和UDP传输。(OSI参考模型将网络

通信分成7个层次,从低往上依次为物理层、数据链路层、网络层、传输层、会话层、表

示层、应用层;TCP和UDP均是传输层的协议。)下面,就分别来介绍这两种数据传输方

式。

提示:本章在介绍网络通信双方的时候,会使用两组关键词:服务器-客户机和本地端-远程端。其中,服

务器-客户机是根据角色来界定的;而本地端-远程端是一个相对概念,依据不同的参照物,可以分别表示

不同的角色。比如以服务器为参照物,可以称服务器为本地端,称客户机为远程端;而如果以客户机为参

照物,可以称客户机为本地端,称服务器为远程端。

3.1.1 TCP传输

TCP,Transfer Control Protocol的缩写(传输控制协议),是一种面向连接的网络

传输协议。TCP协议的特点是,支持多数据流操作,提供流控和错误控制,甚至能完成对

乱序到达报文的重新排序等。因此,TCP提供了可靠的应用数据传输服务。

通信双方使用TCP传输的一般过程参考如图3.2。

连接请求

连接确认

数据传送

服务器

客户机

图3.2 TCP通信的一般过程

本节将要实现一个TCP传输的演示程序TCPDemo,它包括服务器和客户机两个部分。它

们的程序界面如图3.3。

图3.3 TCP传输演示程序界面

TCPDemo的演示过程如下:

(1)将服务器和客户机两部分程序都运行起来(此时服务器已经启动了侦听客户机连接请

求的子线程,侦听端口号为10028)。

(2)在客户机程序界面上输入服务器的IP地址(如果服务器和客户机运行在同一台机器

上,IP地址可以指定为127.0.0.1)、侦听端口号(因为服务器在10028端口上侦听,这

里也应该指定为10028)。

(3)点击客户机程序界面上的“Connect”按钮,向服务器发送Socket连接请求。

(4)服务器侦听到有客户机的连接请求后便接受它(于是在两个程序之间就建立了一条可

靠的Socket连接)。然后服务器会向客户机发送两次字符串数据。

(5)客户机接收到数据后,弹出两次如图3.4的消息框。

图3.4 TCP传输客户机接收到数据后显示的消息框

提示:TCPDemo为什么使用10028作为TCP通信的端口号?因为TCP数据包的TCP头结构中,使用了16

位的域来表示一个端口号。因此,有65536个可能的端口号。不过,0-1023是周知口(众所周知的端

口,比如80是超文本传输协议http的端口,25是简单邮件传输协议smtp的端口,20和21是文件传输

协议ftp的端口等),比1023大的端口号通常被称为高端口号。应用程序一般使用高端口号提供自己的

通信服务。TCPDemo使用10028端口是偶然的,只要比1023大就可以了。

TCPDemo在具体实现时,设计了一个CTCPListener类专门用于服务器对特定TCP端口

的侦听。另外,设计了一个CStreamSocket类专门用于TCP数据的传输。CStreamSocket