在編制Winsocket程序的時(shí)候,要有一些必要的步驟: 1、初始化Winsock動(dòng)態(tài)連接庫;
2、建立一個(gè)Winsock對(duì)象。
3、連接主機(jī)。
4、和主機(jī)進(jìn)行數(shù)據(jù)交流。
5、關(guān)閉Socket對(duì)象
6、釋放Winsoket動(dòng)態(tài)鏈接庫。
下面是一個(gè)使用winsock Api實(shí)現(xiàn)finger實(shí)現(xiàn)的源程序:在delphi6中調(diào)試通過。
unit finger;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,winsock, StdCtrls;
type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; edtHost: TEdit; btnFinger: TButton; edtUser: TEdit; memInfo: TMemo; procedure btnFingerClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btnFingerClick(Sender: TObject); var Info:string;//服務(wù)器返回的用戶信息 BufSend,BufRev:pChar;//中間信息 skt:TSOCKET;//創(chuàng)建Socket對(duì)象 addr:TSockAddr;//地址信息 Re:Integer; begin //1、建立Socket skt:=socket(AF_INET,SOCK_STREAM,0); if(skt=INVALID_SOCKET)Then begin memInfo.Lines.Add('Error:Create Winsock Failed'); exit; end; //2、連接主機(jī) ZeroMemory(@addr,sizeof(addr)); Addr.sin_family:=AF_INET; Addr.sin_addr.S_addr:=inet_addr(Pchar(edtHost.Text)); //開放79端口 addr.sin_port:=htons(79); Re:=connect(skt,addr,sizeof(addr)); if(Re<>0)then begin memInfo.Lines.Add('Connect to Server Failed!'); exit; end;
//3、發(fā)送信息 GETMem(BufSend,1024); ZeroMemory(BufSend,1024); Info:=edtUser.Text+#10; StrPCopy(BufSend,info); Re:=Send(skt,Bufsend^,Length(BufSend),0); if(Re=SOCKET_ERROR)then begin memInfo.Lines.Add('Send Data Failed!'); exit; end; //5、讀取主機(jī)返回信息 GetMem(BufRev,1024); Repeat ZeroMemory(BufRev,1024); re:=recv(skt,BufRev^,1024,0); Info:=Strpas(bufRev); memInfo.Lines.Add(Info); Until re=0; memInfo.Lines.Add('FINISH!'); FreeMem(BufSend); FreeMem(BufRev); //6、關(guān)閉socket連接 closesocket(skt); end;
procedure TForm1.FormCreate(Sender: TObject); var WSAData:TWSAData; //是TWSAData類型的變量,系統(tǒng)把加載的版本信息添加到這個(gè)結(jié)構(gòu)中 begin //初始化Winsock if(WSAStartup(MAKEWORD(2,0),WSAData)<>0)then begin //初始化失敗 memInfo.Lines.Add('Winsock Init Failed!'); exit; end else memInfo.Lines.Add('Winsock Start!'); end;
procedure TForm1.FormDestroy(Sender: TObject); begin WSACleanUP(); end;
end. 如果有什么問題,請(qǐng)聯(lián)系 qiujianben@163.com (杭州電子工業(yè)學(xué)院)
|