服务端:
1. 定义结构
type
TMyRecord = record
Ip: array[0..16] of Char;
Port: Integer;
Data: array[0..1023] of Char;
end;
2. 窗体创建的时候设置IP,端口
procedure TfrmServer.FormCreate(Sender: TObject);
begin
idpsrvr1.Bindings.Add;
idpsrvr1.Bindings[0].IP := GetLocalIP;
idpsrvr1.Bindings[0].Port := 8098;
idpsrvr1.Active := True;
Caption := Format('Server: [%s:%d]', [idpsrvr1.Bindings[0].IP,
idpsrvr1.Bindings[0].Port]);
mmo1.DoubleBuffered := True;
end;
3. 设置TIdUDPServer的OnRead事件。
procedure TfrmServer.idpsrvr1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
ReceiveData: TMyRecord;
SendData: TMyRecord;
begin
ZeroMemory(@ReceiveData, SizeOf(ReceiveData));
ZeroMemory(@SendData, SizeOf(SendData));
AData.Read(ReceiveData, SizeOf(ReceiveData));
StrPLCopy(SendData.Ip, idpsrvr1.Bindings[0].IP, Length(SendData.Ip));
SendData.Port := idpsrvr1.Bindings[0].Port;
StrLCopy(SendData.Data, ReceiveData.Data, Length(SendData.Data));
AddData(Format('IP: %s Port: %d Data: %s',
[ReceiveData.Ip, ReceiveData.Port, ReceiveData.Data]));
idpsrvr1.SendBuffer(ReceiveData.Ip, ReceiveData.Port, ReceiveData,
SizeOf(ReceiveData));
end;
获取本机IP地址函数
function GetLocalIP: string; //获取本机局域网IP
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
Buffer: array[0..63] of char;
I: Integer;
GInitData: TWSADATA;
begin
Result := '';
WSAStartup($101, GInitData);
try
GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(Buffer);
if nil <> phe then
begin
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while nil <> pptr^[I] do
begin
Result := StrPas(inet_ntoa(pptr^[I]^));
Inc(I);
end;
end;
finally
WSACleanup;
end;
end;
客户端:
1. 绑定IP
procedure TfrmClient.btnIpClick(Sender: TObject);
begin
idpsrvr1.Bindings.Add;
idpsrvr1.Bindings[0].IP := GetLocalIP;
idpsrvr1.Bindings[0].Port := StrToInt(cbb1.Text);
idpsrvr1.Active := True;
ShowMessage('OK');
end;
2. 发送数据
procedure TfrmClient.btnSendClick(Sender: TObject);
var
MyRecord: TMyRecord;
DataStr: string;
begin
//自己的IP地址
StrPLCopy(MyRecord.Ip, idpsrvr1.Bindings[0].IP, Length(MyRecord.Ip));
//自己的端口
MyRecord.Port := idpsrvr1.Bindings[0].Port;
DataStr := 'Client: ' + edtMsg.Text;
StrPLCopy(MyRecord.Data, DataStr, Length(DataStr));
idpsrvr1.SendBuffer(FServerIp, FServerPort, MyRecord, SizeOf(MyRecord));
tmr1.Enabled := True;
end;
3. 读取数据
procedure TfrmClient.idpsrvr1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
SendData: TMyRecord;
begin
ZeroMemory(@SendData, SizeOf(SendData));
AData.Read(SendData, SizeOf(SendData));
AddData(Format('IP: %s Port:%d Data: %s',
[SendData.Ip, SendData.Port, SendData.Data]));
end;