Ver Mensaje Individual
  #3  
Antiguo 06-05-2006
[fer21unmsm] fer21unmsm is offline
Miembro Premium
 
Registrado: dic 2005
Ubicación: Lima
Posts: 627
Reputación: 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