实例来对各章的基本概念进行解释, 因此必须具备必要的网络编程知识。
在平时工作中, 为了查找安全漏洞, 也需要编写一些短小精悍的程序来代替复杂的手
工命令输入。首先对Linux 中的网络编程作介绍, Linux 对网络通信提供了很好地支持。
由于Windows 系统目前很流行, 特别是开发环境VisualC +, 所以, 后面也对Windows 环境
下的网络编程作了介绍。
我们可以认为套接字是将Unix 系统的文件操作推广到提供点对点的通信。如果要
操作文件, 应用程序会根据应用程序的需要为之创建一个套接字。操作系统返回一个正
数。应用程序通过引用这个正数来使用这个套接字。文件描述符和套接字描述符的不同
点在于, 在程序调用open( )时, 操作系统将一个文件描述符绑定到一个文件或设备, 但在
创建一个套接字时, 可以不将它绑定到一个目标地址。程序可以在任何想要用这个套接
字的时候指定目标地址。
在点对点的通信程序中, 我们将请求服务或数据的程序叫做客户端程序, 提供数据或
服务的软件叫做服务器程序。
对于使用无连接协议的服务器程序和客户端程序的流程, 客户端程序并不和服务器
程序建立连接, 它是通过使用服务器地址作为参数的sendto( )系统调用, 发送一个数据报
给服务器的。同样, 服务器并不接受客户端的连接, 而是用recvfrom( ) 调用等待从客户端
发来的数据。
4 .3 .8 WinSock 网络编程
这里简要介绍一下用WinSock 创建TCP 流套接字程序。
用socket ( ) 函数打开一个流套接字。用AF - INET 指定地址格式参数, SOCK -
STREAM 指定类型参数。
if ( ( WinSocket = socket ( AF - INET , SOCK - STREAM, 0 ) ) = = INVALID -
SOCKET)
{
wsprintf ( szEr ror , TEXT(“Allocating socket failed . Error : %d”) ,
WSAGetLastEr ror ( ) ) ;
MessageBox ( NULL, szError , TEXT (“Error”) , MB- OK) ;
return FALSE;
}
用socket ( )函数打开一个套接字时, 这个套接字没有名字, 仅仅在一个地址家族名字
空间里分配了一个描述符。为了让客户端将套接字区分开来, 一个TCP 流套接字服务器
程序必须命名它的套接字。但不必用bind( )函数命名客户端的套接字。
一个套接字的名字在TCP/ TP 协议里由三部分组成: 协议名称, 主机地址和一个表征应
用程序的端口数字。这些地址域sin - family, sin - addr , sin - port 都是SOCKADDR- IN 结构的
成员。必须在调用bind( )之前初始化SOCKADDR- IN 结构。
一个程序应该在程序结束前, 关闭所有打开的程序, 以便将套接字资源返回给操作系
统。对于TCP 流套接字, 当一个套接字连接结束后, 服务器关闭了由accept ( ) 创建的套