Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-05-2006
[fer21unmsm] fer21unmsm is offline
Miembro Premium
 
Registrado: dic 2005
Ubicación: Lima
Posts: 627
Poder: 19
fer21unmsm Va por buen camino
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.
Responder Con Cita
  #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
Poder: 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
  #3  
Antiguo 06-05-2006
[fer21unmsm] fer21unmsm is offline
Miembro Premium
 
Registrado: dic 2005
Ubicación: Lima
Posts: 627
Poder: 19
fer21unmsm Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
referencia circular melon OOP 1 16-04-2006 02:13:00
Algun manual sobre sockets en deplhi 6.0 Gorst6 Internet 1 04-12-2005 10:30:50
pregunta basica sobre sockets Jan_polero Internet 2 23-02-2005 15:51:49
Sobre Sockets Rabata Varios 3 06-11-2003 18:31:55
ejemplo sobre sockets taurux Varios 0 18-06-2003 18:14:52


La franja horaria es GMT +2. Ahora son las 12:05:00.


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
Copyright 1996-2007 Club Delphi