这篇文章主要介绍如何设计基于多线程的客户端/服务器套接字(socket)类。开发者/设计者可以根据具体的 需要决定是否选用另外的线程。在网络上有许多其它的套接字类,但是没有一个能够向这个类一样为你的应用程序 提供回调功能(事件监测)。本文设计的类能够为你提供如下的事件监测:完成建立链接、放弃链接、链接失败和 接收数据(包括0字节数据包)。
描述:
本文提供一种新的,同时支持TCP和UDP通讯的套接字类,与你可能在本站或其它地方发现的套接字编程文章相 比,本文设计的类有很多优点。首先,这个类没有像其它类要求提供窗口句柄的限制,假如你仅仅要一个控制应用 程序的话,这个限制是不好的,所以,本文的类没有这样的限制。它也为你提供了自动线程支持功能,套接字通过 类的句柄进行链接或断开链接操作,它也提供了目前为之我所见到的类所没有的其它功能。此类同时支持客户端和 服务器套接字,一个服务器端套接字能被指定为一个能够接受很多链接的套接字,一个客户端套接字能够链接一个 服务器端套接字。你还可以使用这个类在不建立链接的情况下在两个应用程序间进行通信。在第二种情况下,你可 以创建两个UDP套接字(每个程序一个)。这个类在创建像聊天室程序,或者在两个或更多IPC(进程间通信) 程序( 进程)时有助于减少编码量。同时为具有TCP/IP错误处理的双方提供可靠的通信支持。你可能会使用确定的IP地址 使数据传递到能够被控制的目的地(仅仅对于UDP方式),这个类的TCP方式只能够在相等的双方进行通信。
现在还不熟悉IP套接字,下面的段落将对此类如何工作进行详细的介绍。这有是本文的目标:解释套接字对象 的基本功能。
TCP/IP 栈
TCP/IP 栈比OSI栈短。
TCP是面向连接的协议,UDP(用户数据报协议)是面向无连接的协议。
IP数据报
IP层提供了一个无连接的,不可靠的传输机制。它认为每个数据包都是相互独立的。任何数据报之间的连接必 须被更高的层支持。IP层提供一种包含自身数据头的和校验。数据头包含数据报的源地址和目的地址。IP层通过网 络处理路由。为了传输,它也提供将大的数据报截断为许多小数据报,并在目的端将它们重新组合的机制。
UDP
UDP是无连接的,也是不可靠的。它将数据报内容的校验和(checksum)和端口号加到IP地址上。
TCP
TCP在IP上提供一个逻辑的可靠的基于连接的协议,它提供一个虚拟的环路,这样两个程序就可以进行通信。
互联网地址
为了使用一个服务,你首先要找到它。互联网使用地址规划计算机,这样计算机就能够被定位。IP地址是一个 整形32位整数,它编码了一个网络ID和相当多的地址。根据网络地址的大小,网络ID被分成了很多类。
网络地址
A类网使用8位作为网络地址,余下的24位表示其他的地址。B类网使用16位作为网络地址,C类网使用24位作为 网络地址,D类网使用全部的32位作为网络地址