Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   referencia sobre sockets (https://www.clubdelphi.com/foros/showthread.php?t=31379)

fer21unmsm 05-05-2006 21:37:31

referencia sobre sockets
 
Hola compañeros del foro, quisiera que me den alguna referencia de alguna pagina que explique sobre la creación, el manejo de sockets, pero desde 0 en delphi, sin utilizacion de componentes como las indy ni nada de eso.

Saludos, y gracias de antemano.

seoane 06-05-2006 00:15:10

1 Archivos Adjunto(s)
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

fer21unmsm 06-05-2006 00:31:53

Cita:

Empezado por seoane
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

Gracias man, justo necesitaba un codigo así para entender mejor. Bueno para mi suerte tambien conozco algo de c++ voy a buscar sockets por allí tambien, gracias nuevamente;)


La franja horaria es GMT +2. Ahora son las 01:20:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi