Un mundo apasionante el de los sockets. Desgraciadamente casi toda la documentacion que hay sobre ellos esta pensada para C y no para delphi, pero poniendo un poco de voluntad traducir el codigo de C a delphi no es muy complicado. Busca ejemplos en C (hay un monton) e intenta entenderlos, y si no encuentras la forma de hacer algo en concreto siempre puedes echarle un vistazo al codigo fuente de los componentes Indy por ejemplo.
Para empezar te voy a dejar un ejemplo MUY sencillo, es una aplicacion de consola que espera por una conexion por el puerto 2000. Una vez conectado mostrara por pantalla todo lo que recibe y cuando cerremos la conexion la aplicacion tambien se cerrara. Para probarlo ejecuta el programa y en una consola teclea "telnet 127.0.0.1 2000" y teclea cualquier cosa.
Bueno aqui te lo dejo, si no entiendes algo me lo dices:
Código Delphi
[-]
program Ejemplo18;
{$APPTYPE CONSOLE}
uses
Windows,
Winsock,
SysUtils;
procedure Conexion(Socket: TSocket);
var
FDSet: TFDSet;
TimeVal: TTimeVal;
buf: array[0..1024] of byte;
Salir: Boolean;
begin
Salir:= FALSE;
while not Salir do
begin
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500;
FD_ZERO(FDSet);
FD_SET(Socket, FDSet);
if select(0, @FDSet, nil, nil, @TimeVal) > 0 then
begin
fillchar(buf, sizeof(buf), 0);
if recv(Socket, buf, sizeof(buf) - 1, 0) > 0 then
Write(String(PChar(@buf)))
else
Salir:= TRUE;
end;
end;
end;
var
WSADATA: TWSADATA;
ServerSocket: TSocket;
LocalAddr: TSockaddr;
ClientSocket: TSocket;
RemoteAddr: TSockaddr;
AddrSize: Integer;
FDSet: TFDSet;
TimeVal: TTimeVal;
Terminar: Boolean;
buf: array[0..1024] of byte;
begin
if WSAStartup(MAKEWORD(1, 1), WSADATA) = 0 then
try
ServerSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if ServerSocket <> INVALID_SOCKET then
begin
with LocalAddr do
begin
sin_family := AF_INET;
sin_port := htons(2000);
sin_addr.s_addr := htonl(INADDR_ANY);
end;
if bind(ServerSocket, LocalAddr, sizeof(LocalAddr)) <> SOCKET_ERROR then
if listen(ServerSocket, SOMAXCONN) <> SOCKET_ERROR then
begin
Terminar:= FALSE;
repeat
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500;
FD_ZERO(FDSet);
FD_SET(ServerSocket, FDSet);
if select(0, @FDSet, nil, nil, @TimeVal) > 0 then
begin
Terminar:= TRUE;
AddrSize := sizeof(RemoteAddr);
ClientSocket := accept(ServerSocket, @RemoteAddr, @AddrSize);
if ClientSocket <> INVALID_SOCKET then
Conexion(ClientSocket);
if Shutdown(ClientSocket, SD_SEND) <> SOCKET_ERROR then
repeat until recv(ClientSocket, buf, sizeof(buf) - 1, 0) <= 0;
CloseSocket(ClientSocket);
end;
until Terminar;
end;
end;
finally
WSACleanup();
end;
end.
Te paso el mismo codigo en un zip listo para usar