Ver Mensaje Individual
  #15  
Antiguo 03-10-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Veo que te has puesto manos a la obra.

He estado ocupado pero en un ratito libre he preparado un ejemplo a bajo nivel con WinSock en programas de consola. Se trata de un pequeño prototipo de chat con modelo cliente servidor y protocolo TCP aceptando una sola conexión, para no liar la cosa.

Dejo el código muy comentado por si más adelante te interesa el manejo a bajo nivel sin componentes:

Servidor:
Código PHP:
int main(int argccharargv[])
{
  
WSADATA Wsa;
  
SOCKET Sock_e;   // Sock de escucha
  
SOCKET Sock_c;   // Sock de comunicación
  
struct sockaddr_in ServerClientAddrEnRoute;
  
int Len=0;
  
char Buffer[1024];
  
DWORD Port 9999;

  
// Inicializamos
  
printf("Inicializando el servidor...\n");
  if(
WSAStartup(MAKEWORD(20), &Wsa) != 0) return 0;

  
//Creamos el socket
  
if((Sock_e socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) != INVALID_SOCKET){
    
// Dirección IP y puerto
    
Server.sin_family AF_INET;
    
Server.sin_addr.s_addr INADDR_ANY;
    
Server.sin_port htons(Port);
    
AddrEnRoute Server;
    
AddrEnRoute.sin_addr = *((struct in_addr *)gethostbyname("localhost")->h_addr);

    
// Asociamos el socket al puerto
    
if(bind(Sock_e, (SOCKADDR*)&Serversizeof(Server)) != -1){
      
// Bucle principal del servidor
      // Este servidor nunca termina, siempre escuchará
      
while(true){
        
// Escuchando puerto
        
printf("\nEscuchando por el puerto %d\n"Port);
        if (
listen(Sock_e1) != -1){
          
//hay una conexión entrante y la aceptamos
          
Len sizeof(sockaddr);
          
Sock_c accept(Sock_e,(sockaddr*)&Client, &Len);
          if(
Sock_c == INVALID_SOCKET) continue;
          
strcpy(Buffer"Aceptada conexión\n\n");
          
printf(Buffer);

          
// Bucle de comunicación
          
do{
            
// Leemos los datos entrantes
            
Len recv(Sock_cBuffersizeof(Buffer), 0); //recibimos los datos que envie
            
if(Len<0) continue;
            
// Si tenemos datos seguimos
            
printf("- "); printf(Buffer);
            if(!
strnicmp(Buffer"Adios"5)) break;
            
printf("\n>> ");
            
gets(Buffer);
            
strcat(Buffer"\n");
            
send(Sock_cBufferlstrlen(Buffer)+10);
          } while(
Len && Len!=-1);

          
closesocket(Sock_c);
        }
      } 
// While(true)
      
closesocket(Sock_e);
    } 
// if(bind)
  
// if(Sock_e)

  
WSACleanup();
  return 
0;

Cliente:
Código PHP:
int main(int argccharargv[])
{
  
WSADATA Wsa;
  
SOCKET  Sock;
  
struct hostent *host;
  
struct sockaddr_in direc;
  
DWORD Port 9999;
  
char Buffer[1024];
  
int Len;
  
bool Salir false;

  
//Inicializamos la librería winsock
  
printf("Inicializando Cliente....\n\n");
  
WSAStartup(MAKEWORD(2,2),&Wsa);

  
//creamos el Sock y comenzamos el bucle principal
  
while(!Salir){
    
Sock socket(AF_INETSOCK_STREAMIPPROTO_TCP);
    if(
Sock !=-1){
      
//Dirección IP del servidor y Puerto
      
host gethostbyname("localhost");
      
direc.sin_family=AF_INET;
      
direc.sin_port htons(Port);
      
direc.sin_addr = *((struct in_addr *)host->h_addr);
      
ZeroMemory(direc.sin_zero8);

      
// Pedimos conexión al servidor
      
printf("Esperando conexión al servidor...\n\n");
      while(
connect(Sock, (sockaddr *)&direcsizeof(sockaddr))){Sleep(200);}

      
printf("Conexión aceptada\n\n");
      
// Saludamos
      
strcpy(Buffer"Gracias por aceptar la conexión\n");
      
printf(">> "); printf(Buffer);
      
send(SockBufferlstrlen(Buffer)+10);

      
//mientras el Sock no se haya desconectado
      
do {
        
Len recv(SockBuffersizeof(Buffer), 0);
        if(
Len<0) continue;
        
// Si hay satos, seguimos
        
printf("- "); printf(Buffer);
        if(!
strnicmp(Buffer"Adios"5)) {Sleep(400); Salir true; break;}
        
printf("\n>> ");
        
gets(Buffer);
        
strcat(Buffer"\n");
        
send(SockBufferlstrlen(Buffer)+10);
      } while(
Len && Len!=-1);
      
closesocket(Sock);
    }
    
Sleep(500);
  }

  
WSACleanup();
  return 
0;

Saludos.

Última edición por escafandra fecha: 04-10-2014 a las 18:25:44.
Responder Con Cita