想学习一下delphi中的api编程
解决方案 »
- 求助~,急~,数据处理问题~
- 关于SPCOMM控件的问题?
- 问一个QUERY的更新问题,很急
- 有挑战的Delphi程序!求教高手!
- 关于DBGrid的两个问题?
- 请问:怎样将一个form放到最前面而又不得到焦点?
- 随机图像小方块的显示
- ServerSocket非阻塞方式每个连结自建一个线程,可当连结断开时服务器程序整个退出,为什么?
- 我是牛虻,我又遇到问题了,救命呀!!!!!!!!!!!!!!1
- 大家好,请教如何让我的程序窗口始终在所有窗口最下面.........................???
- 在TreeView控件中。如何实现,选择功能,就是checkbox的功能?
- 如何将字符串转换成“类”?
{--------------------------------------------------------------
Simple Example.
Implement TCP(both Client and Server) with Socket API
<[email protected]>
--------------------------------------------------------------}unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
WinSock, StdCtrls;const
WM_SOCK = WM_USER + 1; //自定义windows消息
TCP_PORT = 5432; //设定TCP端口号type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
HasConnected, IsServer: boolean;
CliSocket, SvrSocket: integer;
SvrAddrIn, CliAddrIn:TSockAddrIn;
procedure InitSocket;
procedure SendData(Content: string);
procedure ReadData(var Message: TMessage); message WM_SOCK;
procedure SockConnect;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.InitSocket;
var
wsadata: TWsadata;
err{, optval}: integer;
begin WSAStartup($0101,WSAData);
CliSocket := socket(AF_INET, SOCK_STREAM,IPPROTO_IP);
SvrSocket := socket(AF_INET, SOCK_STREAM,IPPROTO_IP); if (CliSocket = INVALID_SOCKET)or(SvrSocket = INVALID_SOCKET) then
begin
ShowMessage(inttostr(WSAGetLastError())+' Socket创建失败');
CloseSocket(CliSocket);
exit;
end; SvrAddrIn.sin_addr.s_addr:= INADDR_ANY;
SvrAddrIn.sin_family := AF_INET;
SvrAddrIn.sin_port :=htons(TCP_PORT);
Bind(SvrSocket, SvrAddrIn, sizeof(SvrAddrIn)); err := Listen(SvrSocket,5);
if err<>0 then ShowMessage('Listen error.'); {optval := 1;
if SetSockopt(SvrSocket,SOL_SOCKET,SO_REUSEADDR,pchar(@optval),sizeof(optval)) = SOCKET_ERROR then
begin
showmessage('SO_REUSEADDR set error.');
end; } //绑定消息映射
WSAAsyncSelect(SvrSocket, Handle , WM_SOCK, FD_READ or FD_ACCEPT or FD_CONNECT or FD_WRITE or FD_CLOSE);
WSAAsyncSelect(CliSocket, Handle , WM_SOCK, FD_READ or FD_ACCEPT or FD_CONNECT or FD_WRITE or FD_CLOSE);end;procedure TForm1.SockConnect;
var
err: integer;
begin CliAddrIn.sin_addr.s_addr:=inet_addr(PChar(Edit1.Text));
CliAddrIn.sin_family := AF_INET;
CliAddrIn.sin_port :=htons(TCP_PORT);
repeat
err:=connect(CliSocket,CliAddrIn, SizeOf(CliAddrIn));
if err = -1 then
begin
{ if we use WSAAsyncSelect(CliSocket...) in order to receive data at
Client side, here will get error, but it still works. why?
}
//ShowMessage('connect error.');
//ListBox1.Items.Add('connect error.');
HasConnected := false;
break;
end
else
begin
HasConnected := true;
IsServer := false;
end;
until err=0;end;procedure TForm1.SendData(Content: string);
begin
Send(CliSocket,Content[1],length(Content),0);
end;procedure TForm1.ReadData(var Message: TMessage);
var
Event: word;
Buf:array[0..1023] of char;
AddrLen, DataLen: integer;
begin
//
AddrLen := sizeof(SvrAddrIn);
Event := WSAGetSelectEvent(Message.LParam); case Event of
FD_CONNECT:
begin
ListBox1.Items.Add('connect');
HasConnected := true;
//do nothing?
end;
FD_ACCEPT:
begin
IsServer := true;
HasConnected := true;
ListBox1.Items.Add('accept');
//CloseSocket(CliSocket);
CliSocket := Accept(SvrSocket,@SvrAddrIn,@AddrLen);
end;
FD_READ:
begin
DataLen := Recv(CliSocket,Buf,1024,0);
buf[DataLen] := #0;
ListBox1.Items.Add(Buf);
end;
FD_WRITE:
begin
ListBox1.Items.Add('write');
end;
FD_OOB:
begin
ListBox1.Items.Add('FD_OOB');
end;
FD_CLOSE:
begin
HasConnected := false;
ListBox1.Items.Add('close');
end;
end; //end of case
end;procedure TForm1.Button1Click(Sender: TObject);
begin
//202.104.32.230
if (not IsServer)and(not HasConnected) then SockConnect;
SendData('hello, world');
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseSocket(SvrSocket);
CloseSocket(CliSocket);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
HasConnected := false;
IsServer := false;
InitSocket;
end;end.
unit udp;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, winsock,
StdCtrls;const
WM_SOCK = WM_USER + 1; //自定义windows消息
UDPPORT = 646; //设定UDP端口号type
Tfrmmain = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
s: TSocket;
addr: TSockAddr;
FSockAddrIn : TSockAddrIn;
//利用消息实时获知UDP消息
procedure ReadData(var Message: TMessage);
message WM_SOCK;
public
{ Public declarations }
procedure SendData(Content: String);
end;var
frmmain: Tfrmmain;implementation{$R *.DFM}procedure Tfrmmain.FormCreate(Sender: TObject);
var
TempWSAData: TWSAData;
//optval: integer;
begin
// 初始化SOCKET
if WSAStartup($101, TempWSAData)=1 then
showmessage('StartUp Error!'); s := Socket(AF_INET, SOCK_DGRAM, 0);
if (s = INVALID_SOCKET) then //Socket创建失败
begin
showmessage(inttostr(WSAGetLastError())+' Socket创建失败');
CloseSocket(s);
// exit;
end;
//发送方SockAddr绑定
addr.sin_family := AF_INET;
addr.sin_addr.S_addr := INADDR_ANY;
addr.sin_port := htons(UDPPORT);
if Bind(s, addr, sizeof(addr)) <> 0 then
begin
showmessage('bind fail');
end;
{optval:= 1;
if setsockopt(s,SOL_SOCKET,SO_BROADCAST,pchar(@optval),sizeof(optval)) = SOCKET_ERROR then
begin
showmessage('无法进行UDP广播');
end;}
WSAAsyncSelect(s, frmmain.Handle , WM_SOCK, FD_READ);
//接收端SockAddrIn设定
FSockAddrIn.SIn_Family := AF_INET;
FSockAddrIn.SIn_Port := htons(UDPPORT);
label3.Caption := '端口:'+inttostr(UDPPORT);
end;procedure Tfrmmain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseSocket(s);
end;procedure Tfrmmain.ReadData(var Message: TMessage);
var
buffer: Array [1..4096] of char;
len: integer;
flen: integer;
Event: word;
value: string;
begin
flen:=sizeof(FSockAddrIn);
FSockAddrIn.SIn_Port := htons(UDPPORT);
Event := WSAGetSelectEvent(Message.LParam);
if Event = FD_READ then
begin
len := recvfrom(s, buffer, sizeof(buffer), 0, FSockAddrIn, flen);
value := copy(buffer, 1, len);
Memo1.Lines.add(value)
end;
end;procedure Tfrmmain.SendData(Content: String);
var
value{,hostname}: string;
len: integer;
begin FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(Edit1.text)); //INADDR_BROADCAST; //INADDR_BROADCAST = -1 ?
value := Content;
len := sendto(s, value[1], Length(value), 0, FSockAddrIn, sizeof(FSockAddrIn));
if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then
showmessage(inttostr(WSAGetLastError()));
if len = SOCKET_ERROR then
showmessage('send fail');
if len <> Length(value) then
showmessage('Not Send all');
end;procedure Tfrmmain.Button1Click(Sender: TObject);
begin
senddata(Edit2.text);
end;end.
var MyWSA:WSADATA ;
Svr:Sockaddr_in;
hSocket:TSOCKET;
cbRead,cbWritten:integer;
//NewEvent:WSAEVENT;
// NetworkEvents:WSANETWORKEVENTS
begin
cbRead:=0;
cbWritten:=0;
If WSAStartup(MAKEWORD(2,2), MyWSA) <> 0 Then
Begin
WSACleanup;
Exit;
end;
hSocket := Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
If hSocket = INVALID_SOCKET Then
Begin
WSACleanup;
Exit;
End;
Svr.sin_family := AF_INET;
Svr.sin_port := htons(strtoint(edit2.Text));
Svr.sin_addr.S_addr := inet_addr(PChar(trim(edit1.Text)));
if (not radiobutton8.Checked) then
begin
if connect(hSocket, Svr, SizeOf(Svr))=SOCKET_ERROR then
begin
memo1.Lines.Append('connect error!!');
if closesocket(hSocket)<>0 then
begin
memo1.Lines.Append('Close Socket Error!');
Exit ;
end
else
begin
memo1.Lines.Append('Close Socket Successed!!');
Exit;
end
end
else
begin
if( radiobutton1.Checked) then
begin
CMessage[0]:='Q';
CMessage[1]:='P';
MessageLength:=2;
end
else
if( radiobutton2.Checked) then
begin
CMessage[0]:='Q';
CMessage[1]:='C';
MessageLength:=2;
end
else
if( radiobutton3.Checked) then
begin
GetSystemTime(SetTime);
CMessage[0]:='T';
CMessage[1]:=chr(SetTime.wYear div 100);
CMessage[2]:=chr(SetTime.wYear mod 100);
CMessage[3]:=chr(SetTime.wMonth);
CMessage[4]:=chr(SetTime.wDay);
CMessage[5]:=chr(SetTime.wDayOfWeek);
CMessage[6]:=chr(SetTime.wHour);
CMessage[7]:=chr(SetTime.wMinute);
CMessage[8]:=chr(SetTime.wSecond);
MessageLength:=9;
end
else
if( radiobutton4.Checked) then
begin
CMessage[0]:='R';
MessageLength:=1;
end
else
if( radiobutton5.Checked) then
begin
CMessage[0]:='C';
CMessage[1]:='O';
CMessage[2]:='K';
CMessage[3]:='o';
CMessage[4]:='k';
MessageLength:=5;
end
else
if( radiobutton6.Checked) then
begin
CMessage[0]:='H';
MessageLength:=1;
end
else
if( radiobutton7.Checked) then
begin
CMessage[0]:='Q';
CMessage[1]:='L';
MessageLength:=2;
end
else
begin
CMessage[0]:='X';
MessageLength:=1;
end;
StatusBar1.SimpleText:='发送命令!';
cbWritten:=send(hsocket,CMessage,MessageLength,MSG_DONTROUTE);
memo1.Lines.Append('发送到路口端信息:'+trim(CMessage));
CMessage:='\0';
end;
while(not((cbRead>0 )and (cbRead<50))) do
begin
cbRead:=recv(hsocket,chBuf,50,MSG_PEEK);
end;
//chBuf[cbRead]:='0';
cbRead:=0;
if((chBuf[0]='S') and (chBuf[1]='P') and radiobutton1.Checked) then
begin
memo1.Lines.Append('欢迎使用闯红灯自动记录仪设备');
memo1.Lines.Append('路口设备硬件自检......');
//memo1.Lines.Append('内核电压 :'+ (single(chBuf[2])* 0.016).asstring +'V');
memo1.Lines.Append('路口设备硬件自检......');
memo1.Lines.Append('路口设备硬件自检......');
memo1.Lines.Append('路口设备硬件自检......');
memo1.Lines.Append('接收路口端信息:'+trim(chBuf));
end
else if (not radiobutton8.Checked) then
memo1.Lines.Append('接收路口端信息:'+trim(chBuf));
chBuf:='\0';
shutdown(hSocket,SD_BOTH);
GetSystemTime(OldTime);
GetSystemTime(NewTime);
while((NewTime.wSecond-OldTime.wSecond>Interval) or (OldTime.wSecond-NewTime.wSecond>NInterval)) do
begin
GetSystemTime(NewTime);
end;
closesocket(hsocket);
end//if
else
memo1.Lines.Append('断开连接!');
WSACleanup();end;