uses sockets;
procedure SendString(Sock: TSocket; const AHost: String; APort: Word, const Data: String);
var
Addr: TSockAddr_IN;
begin
Addr^.sin_family := AF_INET;
Addr^.sin_port := HToNS(APort);
Addr^.sin_addr.s_addr := LongWord(StrToNetAddr(AHost));
fpSendTo(Sock, Pointer(Data), Data.Length, 0, @Addr, SizeOf(Addr));
end;
procedure ReceiveString(Sock: TSocket; out SenderHost: String; out SenderPort: Word): String;
var
addr: PSockAddr_IN;
addrLen: PSizeInt;
DataSize: SizeInt;
begin
New(addr);
New(addrLen);
try
SetLength(Result, 512);
DataSize := fpRecvFrom(Sock, Pointer(Result), Result.Length, 0, addr, addrLen);
SetLength(Result, DataSize);
SenderHost := NetAddrToStr(addr^.sin_addr.s_addr);
SenderPort := NToHs(addr.sin_port);
finally
Dispose(addr);
Dispose(addrLen);
end;
end;
var
Sock: TSocket;
data: String;
HostIP: String = '127.0.0.1';
HostPort: Word = 1337;
begin
Sock := fpSocket(AF_INET, SOCK_DGRAM, 0);
if Sock < 0 then
Exit; // error;
// Send console input to host
ReadLn(data);
SendString(Sock, HostIP, Port, data);
// Receive data:
data := ReceiveString(Sock, HostIP, Port);
WriteLn('Received from ', HostIP, ':', Port, ' ', data);
end;