Итак, обещанный пример по работе с сетью
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