Ver Mensaje Individual
  #2  
Antiguo 06-05-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
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);
        // sin_addr.s_addr:= Inet_Addr('127.0.0.1');
      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
              // Para este ejemplo solo vamos a aceptar una conexion.
              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
Archivos Adjuntos
Tipo de Archivo: zip Ejemplo18.zip (25,6 KB, 80 visitas)
Responder Con Cita