Итак, обещанный пример по работе с сетью
1. Где то в начале программы нужно произвести вызов
var
data : TWSAData;
.....
WSAStartup(257,data);
2. Подключение. Нужно использовать метод ConnectTo( ... ). Остальные методы необходимы для работы ConnectTo.
- Код: Выделить всё
function TIntfModule_TCPIPSupp.ConnectTo(Address : String; Port : Integer) : TSocket;
var
addr : Integer;
sockAddr : TSockAddrIn;
n : Integer;
begin
result := socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if IsCorrectIP(Address) then addr := AddressToIP(Address)
else addr := ResolveAddress(Address);
sockAddr.sin_family := AF_INET;
sockAddr.sin_port := htons(Port);
move(addr,
sockAddr.sin_addr,
SizeOf(Integer));
if (connect(result,sockAddr,sizeof(TSockAddrIn)) <> SOCKET_ERROR) then
begin
n := 1;
setsockopt(result,IPPROTO_TCP,TCP_NODELAY,@n,SizeOf(Integer));
end
else
begin
closesocket(result);
result := INVALID_SOCKET;
end;
end;
function TIntfModule_TCPIPSupp.ProcessIpAddrStr(IpAddrStr : String) : String;
var
i : Integer;
begin
result := IpAddrStr;
for i := 1 to Length(result) do
if not (result[i] in ['0' .. '9']) then result[i] := ',';
end;
function TIntfModule_TCPIPSupp.IsCorrectIP(IpAddr : String) : Boolean;
var
i,n,k,m : Integer;
begin
m := 0;
with TStringList.Create() do
begin
try
CommaText := ProcessIpAddrStr(IpAddr);
if (Count = 4) then
begin
for i := 0 to 3 do
begin
val(Strings[i],n,k);
if ((k <> 0) and (n > 0)) then Inc(m);
end;
end
else
begin
m := 1;
end;
finally
Free();
end;
end;
result := m = 0;
end;
function TIntfModule_TCPIPSupp.ResolveAddress(AddressStr : String) : Integer;
var
hostEnt : PHostEnt;
pAddr : PInteger;
addrStr : String;
begin
result := 0;
addrStr := AddressStr + #0;
hostEnt := gethostbyname(@addrStr[1]);
if (hostEnt <> NIL) then
begin
pAddr := PInteger(hostEnt^.h_addr_list^);
result := pAddr^;
end;
end;
function TIntfModule_TCPIPSupp.AddressToIP(AddressStr : String) : Integer;
var
addrBuf : array [0 .. 3] of Byte;
i : Integer;
begin
FillChar(addrBuf[0],SizeOf(addrBuf),0);
with TStringList.Create() do
begin
try
CommaText := ProcessIpAddrStr(AddressStr);
for i := 0 to 3 do
addrBuf[i] := StrToInt(Strings[i]);
finally
Free();
end;
end;
move(addrBuf[0],
result,
SizeOf(Integer));
end;
3. Для чтения данных используется стандартная функция
recv.
Пример вызова применительно к FPC:
recv(sock,@tmpBuf[0],SizeOf(tmpBuf),0);
где sock - результат функции ConnectTo.
В зависимости от логики программы, вызов recv может быть организован либо в отдельном, либо в основном потоке.
4. Для отправки данных используется функция
send. Пример вызова:
send(sock,Buffer[0],BufferSize,0);
5. Закрытие соединения - closesocket(sock)
6. При закрытии приложения не забываем вызвать
WSACleanup