WINSOCK的基本概念
基层网络协议,Winsock是访问它们的首选接口。
要说明的是,Winsock是网络编程接口,而不是协议。
Winsock的API是建立在套接字基础上的。所谓套接字,就是一个指向传输提供者的句柄。Win32中,套接字不同于文件描述符,所以它是一个独立的类型—SOCKET。
第一个程序
一个在服务器和客户机之间建立连接并通讯的程序。
我们使用TServerSocket组件来建立服务器端的程序。
它包含两个memo组件,用来分别处理接收到的数据和发送的数据,然后再在窗体上方一个TServerSocket组件,ServerType设置为stNonBlocking,Port设置为100,active设置为true,写几句简单的代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ScktComp;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
Memo1: TMemo;
Button1: TButton;
StatusBar1: TStatusBar;
Memo2: TMemo;
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
private
...{ Private declarations }
public
...{ Public declarations }
end;
var
Form1: TForm1;
implementation
...{$R *.dfm}
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'connect';
end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'disconnect';
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add( Socket.ReceiveText);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if ServerSocket1.Active then
ServerSocket1.Socket.Connections[0].SendText(Memo2.Text);
end;
end.
{然后编译程序。
客户端实现:
客户端相对复杂一些,因为我们要有一个用来接收服务器IP地址的edit,以及端口地址的edit。
}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ScktComp;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
edIp: TEdit;
Label1: TLabel;
Label2: TLabel;
edPort: TEdit;
StatusBar1: TStatusBar;
Memo1: TMemo;
btnConnect: TButton;
btnSent: TButton;
btnDisconnect: TButton;
Memo2: TMemo;
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure btnConnectClick(Sender: TObject);
procedure btnDisconnectClick(Sender: TObject);
procedure btnSentClick(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
private
...{ Private declarations }
public
...{ Public declarations }
end;
var
Form1: TForm1;
implementation
...{$R *.dfm}
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := '连接成功';
end;
procedure TForm1.btnConnectClick(Sender: TObject);
begin
if not ClientSocket1.Active then
begin
ClientSocket1.Host := edIp.Text;
ClientSocket1.Port := StrToInt(edPort.Text);
ClientSocket1.Open;
(Sender as TButton).Enabled := false;
btnDisconnect.Enabled := true;
end;
end;
procedure TForm1.btnDisconnectClick(Sender: TObject);
begin
if ClientSocket1.Active then
begin
ClientSocket1.Close;
btnDisconnect.Enabled := false;
btnConnect.Enabled := true;
end;
end;
procedure TForm1.btnSentClick(Sender: TObject);
begin
if ClientSocket1.Active then
ClientSocket1.Socket.SendText(Memo1.Text)
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo2.Lines.Add(Socket.ReceiveText);
end;
end
我们可以使用Winsock来编程一个网络会话程序。
TClientSocket以及TServerSocket是一个组件,他们的目的是让我们可以建立典型的客户机/服务器模式的通讯程序,
勿在浅沙筑高楼。在谈论TServerSocket等组件编写之前,这里先对Winsock中一些基本概念和API函数做一个简单的说明。
一、定址
要通过Winsock建立通信,必须了解如何利用指定的协议为工作站定址。Winsock 2引入了几个新的、与协议无关的函数,它们可和任何一个地址家族一起使用;但是大多数情况下,各协议家族都有自己的地址解析机制,要么通过一个函数,要么作为一个投给getsockopt的选项。
因为目前网络编程中用的最多最普遍的也许就是TCP/IP协议了,所以这里主要介绍此协议下的WinSock编程。
1、IP
网际协议(Internet Protocol, IP)是一种用于互联网的网络协议,已经广为人知。它可广泛用于大多数计算机操作系统上,也可用于大多数局域网LAN(比如办公室小型网络)和广域网WAN(比如说互联网)。从它的设计看来, IP是一个无连接的协议,不能保证数据投递万
无一失。两个比它高级的协议(TCP和UDP)用于依赖IP协议的数据通信。