Socket 编程指南及示例程序
1 前言
在一些常用的编程技术中,Socket 网络编程可以说是最简单的一种。而且 Socket 编程需要的基础知识很少,适合初学者学习网络编程。目前支持网
络传输的技术、语言和工具繁多,但是大部分都是基于Socket 开发的,虽说这些“高级”的网络技术屏蔽了大部分底层实现,号称能极大程度的简化
开发,而事实上如果你没有一点 Socket 基础,要理解和应用这些技术还是很困难的,而且会让你成为“半瓢水”。
深有感触的是当年我学习 CORBA 的时候,由于当时各方面的基础薄弱,整整啃了半年书,最终还是一头雾水。如果现在让我带一个人学CORBA,我
一定会安排好顺序:首先弄清 C++语法;然后是 VC 编译环境或者 nmake 的用法;接下来学习一些网络基础知识;然后是 Socket 编程;这些大概
要花费 3、4 个月。有了这些基础学习 CORBA 一周即可弄懂,两个月就可以基于 CORBA 进行开发了。
好了,说了半天其实中心思想就一个,Socket 很简单,很好学!如果你会 C++或者 JAVA,又懂一点点网络基础如 TCP 和 UDP 的机制,那么你看
完本文就可以熟练进行 Socket 开发了。
2Socket 简介(全文摘抄)
(本节内容全部抄自网络,不保证正确性,有兴趣的可以看看!)
80 年代初,美国政府的高级研究工程机构(ARPA)给加利福尼亚大学 Berkeley 分校提供了资金,让他们在 UNIX 操作系统下实现 TCP/IP 协议。
在这个项目中,研究人员为 TCP/IP 网络通信开发了一个 API(应用程序接口)。这个 API 称为 Socket 接口(套接字)。今天,SOCKET 接口是 TCP/IP
网络最为通用的 API,也是在 INTERNET 上进行应用开发最为通用的 API。
90 年代初,由 Microsoft 联合了其他几家公司共同制定了一套 WINDOWS 下的网络编程接口,即 WindowsSockets 规范。它是 BerkeleySockets
的重要扩充,主要是增加了一些异步函数,并增加了符合 Windows 消息驱动特性的网络事件异步选择机制。WINDOWSSOCKETS 规范是一套开放
的、支持多种协议的 Windows 下的网络编程接口。从 1991 年的 1.0 版到 1995 年的 2.0.8 版,经过不断完善并在 Intel、Microsoft、Sun、SGI、
Informix、Novell 等公司的全力支持下,已成为 Windows 网络编程的事实上的标准。目前,在实际应用中的 WINDOWSSOKCETS 规范主要有 1.1
版和 2.0 版。两者的最重要区别是 1.1 版只支持 TCP/IP 协议,而 2.0 版可以支持多协议。2.0 版有良好的向后兼容性,任何使用 1.1 版的源代码,
二进制文件,应用程序都可以不加修改地在 2.0 规范下使用。
SOCKET 实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有SOCKET 接口的计算机通信。应用程序在网络上传输,接收的信
息都通过这个 SOCKET 接口来实现。在应用开发中就像使用文件句柄一样,可以对 SOCKET 句柄进行读,写操作。
3 再说两句
网上很多文章对于 Socket 的来龙去脉有如教科书一般的精准。但是涉及具体编程技术就往往被VC 等集成开发环境所毒害了,把 Windows SDK、
MFC、Socket、多线程、DLL 以及编译链接等等技术搅合在一起煮成一锅夹生饭。
既然要学习 Socket,就应该用最简单直白的方式把 Socket 的几个使用要点讲出来。我认为程序员最关心的有以下几点,按照优先级排列如下:
1.Socket 的机制是什么?
2.用 C/C++写 Socket 需要什么头文件、库文件、DLL,它们可以由谁提供,安装后一般处于系统的哪个文件夹内?
3.编写 Socket 程序需要的编程基础是什么?
4.Socket 库内最重要的几个函数和数据类型是什么?
5.两个最简单的例子程序;
6.一个贴近应用的稍微复杂的 Socket 应用程序。
我将一一讲述这些要点,并给出从简到繁,从朴素到花哨的所有源代码以及编译链接的命令。
4Socket 的机制是什么?
我们可以简单的把 Socket 理解为一个可以连通网络上不同计算机程序之间的管道,把一堆数据从管道的A 端扔进去,则会从管道的 B 端(也许同时
还可以从 C、D、E、F……端冒出来)。管道的端口由两个因素来唯一确认,即机器的 IP 地址和程序所使用的端口号。IP 地址的含义所有人都知道,
所谓端口号就是程序员指定的一个数字,许多著名的木马程序成天在网络上扫描不同的端口号就是为了获取一个可以连通的端口从而进行破坏。比较
著名的端口号有 http 的 80 端口和 ftp 的 21 端口(我记错了么?)。当然,建议大家自己写程序不要使用太小的端口号,它们一般被系统占用了,
也不要使用一些著名的端口,一般来说使用 1000~5000 之内的端口比较好。
1