Página 2 de 2 PrimerPrimer 12
Resultados 21 al 32 de 32

Algoritmo

  1. #21 Posible codigo servidor. 
    Medio Avatar de Dupont
    Fecha de ingreso
    Dec 2001
    Ubicación
    Granada / Valencia
    Mensajes
    132
    Descargas
    0
    Uploads
    0
    Buenas.... Aunque yo sea un programador LINUX puedo dar una serie de consejos para el código que inicia la sesión servidor. Yo no soy un programador de Window$, sencillamente porque no es un sistema compatible 100% con la norna ISO/IEEE POSIX (Portable Operating System Interface), que permite portabilidad de los programas entre plataformas distintas.

    Pues bien, el código para construir un servidor simple bajo el estandar POSIX y en ANSI C sería el siguiente. Evidentemente, este programa se compilará regularmente en cualquier casi cualquier plataforma que NO SEA MICRO$OFT WINDOW$.... Por cierto, utiliza sockets Berkley, no winsockets, por lo que el porte a otras plataformas sería muy facil.

    En este ejemplo, el servidor escucha en el puerto 8000 (por decir uno cualquiera) y admite peticiones desde el cliente de un máximo de 16.384 bytes de datos (cantidad mas que razonable para estos menesteres)

    #include < stdio.h >
    #include < sys/socket.h >
    #include < netinet/in.h >
    #include < arpa/inet.h >
    #include < netdb.h >

    int port = 8000; //Número de puerto a la escucha... (se puede cambiar por el que queramos)

    void main() {
    struct sockaddr_in sin;
    struct sockaddr_in pin;
    int sock_descriptor;
    int temp_sock_descriptor;
    int address_size;
    char buf[16384]; //Cadena de datos máximos que acepta del cliente (se puede cambiar, claro y hacerlo mas grande :-) )
    int i, len;

    sock_descriptor = socket(AF_INET, SOCK_STREAM, 0);
    if (sock_descriptor == -1) {
    perror("Llamada al socket");
    exit(1);
    }

    bzero(&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(port);

    if (bind(sock_descriptor, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
    perror("llamada para unir");
    exit(1);
    }

    if (listen(sock_descriptor, 20) == -1) //El 20 significa que puede aceptar una cola de entrada de hasta 20 conexiones (por ejemplo)
    {
    perror("Llamada para escuchar");
    exit(1);
    }

    printf("Aceptando conexiones ...\n");

    while(1) {
    temp_sock_descriptor =
    accept(sock_descriptor, (struct sockaddr *)&pin,
    &address_size);
    if (temp_sock_descriptor == -1) {
    perror("Llamada para aceptar");
    exit(1);
    }

    if (recv(temp_sock_descriptor, buf, 16384, 0) == -1) {
    perror("Llamada a recv");
    exit(1);
    }

    printf("Recibido del cliente:%s\n", buf);

    if (send(temp_sock_descriptor, buf, len, 0) == -1) {
    perror("Llamada para enviar");
    exit(1);
    }

    close(temp_sock_descriptor);

    }
    }


    Pues bien, según he podido consultar por internet, para que esto funcione bajo Window$ no hay nada más que cambiar todas las cabeceras por una sola, que sería la siguiente...

    #include < winsock.h >

    Según parece, en esta librería estan todas las definiciones de las funciones utilizadas en el programa, ya que son convenciones estandar hasta para el window$

    Ah, se me olvidaba, habría que ejecutar WSAStartup() antes de hacer nada con la biblioteca de sockets. El código para hacerlo es algo parecido a esto:

    #include < winsock.h >
    {
    WSADATA wsaData; // Si esto no funciona
    //WSAData wsaData; // prueba esto en su lugar
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
    fprintf(stderr, "WSAStartup falló.\n");
    exit(1);
    }

    También tienes que decirle a tu compilador que enlace la biblioteca Winsock, que normalmente se llama wsock32.lib o winsock32.lib o algo así. Con VC++, esto puede hacerse con el menú Project , bajo Settings... Haz click en la pestaña Link y busca el cuadro titulado "Object/library modules". Añade "wsock32.lib " a esa lista.

    No se la fiabilidad de todo esto, pero para los fines a los que está dirigido este programa servidor, habría que eliminar todo el código de gestión de errores y excepciones, es decir, eliminar todo el código donde ponga perror() y stderr...

    Si quereis una explicación más detallada de lo que hace cada linea, me lo posteais o me mandais un mensaje privado y yo lo eleboro un poquito mas y os modifico este post con todas las explicaciones.

    Saludos.
    "Dios es mi personaje de ficción favorito" (Homer Simpson)
    Linux registered user#283695
    Citar  
     

  2. #22  
    Avanzado
    Fecha de ingreso
    Nov 2001
    Ubicación
    Van Galia
    Mensajes
    434
    Descargas
    0
    Uploads
    0
    Acabo de volver a la vida...
    a ver si tengo un par de horitas libres y me pongo con esto

    ...:::I'm here from beneath Earth:::...
    Citar  
     

  3. #23  
    Administrador Foros HH
    Fecha de ingreso
    Mar 2002
    Mensajes
    3.067
    Descargas
    5
    Uploads
    0
    Hey Angeliyo, muy buenas, que le ha pasado a tu página??
    Citar  
     

  4. #24 Alguien ha probado el código 
    Medio Avatar de Dupont
    Fecha de ingreso
    Dec 2001
    Ubicación
    Granada / Valencia
    Mensajes
    132
    Descargas
    0
    Uploads
    0
    Pues eso. Alguien ha probado el código del servidor ese que postee un poco más arriba???¿?¿?¿?

    Saludos
    "Dios es mi personaje de ficción favorito" (Homer Simpson)
    Linux registered user#283695
    Citar  
     

  5. #25 Voy a ir soltado código de "nuestro" programa 
    Medio Avatar de Dupont
    Fecha de ingreso
    Dec 2001
    Ubicación
    Granada / Valencia
    Mensajes
    132
    Descargas
    0
    Uploads
    0
    Bueno, como parece que NADIE POSTEA CÓDIGO, lo haré yo. Empezaré con el servidor, posteando cachos del proyecto para visual C utilizando la mierda de los win sockets, porque parece que por aquí nadie tiene muchas ganas de darle vueltas al coco y ni siquiera buscar por internet... Despues de eso, vendrá el código del programa Cliente, fichero a fichero del proyecto (visual C++)....

    Como dice Linus Torvalds cuando alguien le viene calentándole la cabeza con nuevas técnicas de programación..... Dice:"Enséñame el código".... Pues bien, yo soy de esos, y hasta que no veo el código, no me lo creo, así que ahi va la cosa....

    Por cierto, puede que haya lineas que no aparezcan, porque el foro las interpreta como HTML, de todas formas, intento hacer todo lo posible para que nada se escape.... Saludos

    P.D: El código no está completo. Por supuesto tendrá que ser otro el que codifique todas esas maravilloooooooosas ideas que habeis escrito al principio y que se pueden encontrar en cualquer web de programación. A partir de aqui, todo es casi coser y cantar, ya que esta escrito con la API de WIndow$ utilizando Sockets Windows y no los Berkeley (POSIX) que es como en un principio postee.

    Saluuuuudos de nueeeevo....
    Última edición por Dupont; 29-07-2002 a las 15:15
    "Dios es mi personaje de ficción favorito" (Homer Simpson)
    Linux registered user#283695
    Citar  
     

  6. #26 SERVER: comm.h 
    Medio Avatar de Dupont
    Fecha de ingreso
    Dec 2001
    Ubicación
    Granada / Valencia
    Mensajes
    132
    Descargas
    0
    Uploads
    0
    #include < winsock.h >
    #include < stdio.h >

    class Comm {

    public:

    Comm();
    ~Comm();

    virtual void openConn();
    virtual void openServerConn();

    virtual void closeConn();
    virtual void sendData(char *);
    virtual void recvData(char *);

    virtual void setPort(int);

    virtual void setMaxMsgLength(int);

    virtual char* getAddr();
    virtual bool isConnected() {return connected;}

    virtual void setIP(char*);
    virtual char *getIP();

    virtual void setAddr(char*);

    protected:

    WSADATA ws;
    SOCKET sckt;
    sockaddr_in san;

    char *IP;

    int MSG_LENGTH;
    int PORT;
    int sanSize;
    bool connected; //Booleano para ver si ha conectado o no
    };
    Última edición por Dupont; 29-07-2002 a las 14:32
    "Dios es mi personaje de ficción favorito" (Homer Simpson)
    Linux registered user#283695
    Citar  
     

  7. #27 SERVER: comm.cpp 
    Medio Avatar de Dupont
    Fecha de ingreso
    Dec 2001
    Ubicación
    Granada / Valencia
    Mensajes
    132
    Descargas
    0
    Uploads
    0
    #include "Comm.h"

    Comm :: Comm() {

    connected = false;
    IP = new char[17];
    for (int i=0;i<17;i++) {
    IP[i] = ' ';
    }
    }

    Comm :: ~Comm() {}

    void Comm :: openConn() {

    int e;

    san.sin_family = AF_INET;
    san.sin_port = htons(PORT);
    san.sin_addr.s_addr = inet_addr(IP);
    sanSize = sizeof(san);

    e = WSAStartup(0x0101,&ws);
    sckt = socket(AF_INET, SOCK_DGRAM,0);
    printf("\nError Report: %d\n", WSAGetLastError());

    }

    char* Comm :: getAddr() {

    return inet_ntoa(san.sin_addr);

    }

    void Comm :: openServerConn() {

    int e;
    int b;
    san.sin_family = AF_INET;
    san.sin_port = htons(PORT);
    san.sin_addr.s_addr = htonl(INADDR_ANY);
    sanSize = sizeof(san);

    e = WSAStartup(0x0101,&ws);
    sckt = socket(AF_INET, SOCK_DGRAM,0);
    b = bind(sckt,(sockaddr *) &san,sanSize);
    printf("\nError Report: %d\n", WSAGetLastError());
    }

    void Comm :: setAddr(char *addr) { //Para poner la dirección
    for (int c=0;c<17;c++) {
    IP[c] = ' ';
    }

    int i=0;
    while (addr[i + 1] != '$') { //'$' termina
    IP[i] = addr[i+1];
    i++;
    }

    }

    void Comm :: setPort(int p) {
    PORT = p;
    }

    void Comm :: recvData(char *data) {

    int t;

    //printf("Recibiendo del socket: %d", sckt);
    t = recvfrom(sckt,data,MSG_LENGTH,0,(sockaddr *)&san,&sanSize);
    connected = true;


    }

    void Comm :: sendData(char *data) {

    int t;

    t = sendto(sckt,data,MSG_LENGTH,0,(sockaddr *)&san,sanSize);


    }

    void Comm :: setMaxMsgLength(int m) {

    MSG_LENGTH = m;
    }

    char *Comm :: getIP() {
    return IP;
    }

    void Comm :: setIP(char *ip) {

    sprintf(IP, "%s",ip);
    }

    void Comm :: closeConn() {

    shutdown(sckt, 1);
    char *data;
    data = new char[MSG_LENGTH];
    closesocket(sckt);
    connected = false;
    sckt = NULL;
    }
    "Dios es mi personaje de ficción favorito" (Homer Simpson)
    Linux registered user#283695
    Citar  
     

  8. #28 SERVER: protocol.h 
    Medio Avatar de Dupont
    Fecha de ingreso
    Dec 2001
    Ubicación
    Granada / Valencia
    Mensajes
    132
    Descargas
    0
    Uploads
    0
    #ifndef PROTOCOL_H
    #define PROTOCOL_H

    #include < stdio.h >

    const char P_ACCEPT = 'A';
    const char P_CLOSE = 'C';
    const char P_MESSAGE = 'M';
    const char P_SHUTDOWN = 'S';
    const char P_REBOOT = 'R';
    const char P_GETWINDOW = 'G';
    const char P_DELETE = 'K';
    const char P_CAPTION = '&';
    const char P_SPACE = '.';
    const char P_SETIP = 'I';
    const char P_RECEIVED = 'R';
    const char P_WINDOW = 'W';
    const char P_LOADBMP = 'P';
    const char P_SAVEIP = 'B';
    const char P_GETIP = 'X';

    const int HAL_SERVER = 2501;//2501
    const int HAL_US = 2500;//2500
    const int US_SERVER = 2502;
    const int THIRDPARTY = 2503;

    const int MAX_LENGTH = 100;

    char* encode(char cmd, char *str) {

    char msg[MAX_LENGTH] = " ";
    // for (int i=0;i<MAX_LENGTH;i++) {
    // msg[i] = ' ';
    // }
    sprintf(msg, "%c%s",cmd,str);//%s", cmd,str);
    return msg;

    }

    #endif
    Última edición por Dupont; 29-07-2002 a las 14:33
    "Dios es mi personaje de ficción favorito" (Homer Simpson)
    Linux registered user#283695
    Citar  
     

  9. #29 SERVER: server.cpp 
    Medio Avatar de Dupont
    Fecha de ingreso
    Dec 2001
    Ubicación
    Granada / Valencia
    Mensajes
    132
    Descargas
    0
    Uploads
    0
    #include < windows.h >
    #include < windowsx.h >
    #include < winsock.h >
    #include < stdio.h >

    #include " serverComm.h "
    #include " Protocol.h "

    serverComm *hal = new serverComm();
    serverComm *us = new serverComm();

    bool SEND_TO_CLIENT = false;

    DWORD WINAPI Receive_Thread(LPVOID data) {

    char msg[MAX_LENGTH] = " ";
    for (int i=0;i<MAX_LENGTH;i++) {
    msg[i] = ' ';
    }

    while (1) {

    us->openServerConn();
    printf("\nEsperando conexion del emisario2...");
    us->recvData(msg);
    if (msg[0] == P_SAVEIP) {
    us->sendData(msg);
    printf("\nConexion recibida y almacenda del emisario2...");
    us->saveIP();
    SEND_TO_CLIENT = true;
    }
    else if (msg[0] == P_ACCEPT) {
    printf("\nconexion recibida del emisario2...");
    //while (hal->addrCleared()) {Sleep(100);}
    // us->openConn();
    // printf("\nEsperando a una conexion del emisario2...");
    // us->recvData(msg);
    sprintf(msg, "%c%s$", P_SETIP, hal->getSavedIP());
    printf("\nsending %s", msg);
    while (msg[0] != P_RECEIVED) {
    us->sendData(msg);
    us->recvData(msg);
    }
    hal->clearAddr();
    }
    us->closeConn();
    }

    return ((DWORD)data);
    }
    DWORD WINAPI Receive_Thread2(LPVOID data) {

    char msg[MAX_LENGTH] = " ";
    char msgSend[MAX_LENGTH] = " ";
    for (int i=0;i<MAX_LENGTH;i++) {
    msg[i] = ' ';
    msgSend[i] = ' ';
    }

    while (1) {

    hal->openServerConn();
    hal->recvData(msg);
    hal->saveIP();
    if (SEND_TO_CLIENT) {
    printf("\nconect.con proxy para conexion con cliente B at %s", us->getSavedIP());
    sprintf(msgSend, "%c%s$" ,P_SETIP, us->getSavedIP());
    SEND_TO_CLIENT = false;
    }
    else {
    sprintf(msgSend,encode(P_CLOSE," "));
    }
    hal->sendData(msgSend);

    printf("\nCerrando Conexion...");
    hal->closeConn();
    //while (!hal->addrCleared()) {}

    }

    return ((DWORD)data);
    }

    void main() {

    static HANDLE thread_handle = NULL;
    static HANDLE thread_handle2 = NULL;
    unsigned long thread_id;
    unsigned long thread_id2;

    hal->setPort(HAL_SERVER);
    us->setPort(US_SERVER);

    hal->setMaxMsgLength(MAX_LENGTH);
    us->setMaxMsgLength(MAX_LENGTH);

    thread_handle = CreateThread(NULL,0,Receive_Thread,(LPVOID)0,0,&th read_id);
    thread_handle2 = CreateThread(NULL,0,Receive_Thread2,(LPVOID)0,0,&t hread_id2);

    while (1) {};




    }
    Última edición por Dupont; 29-07-2002 a las 14:38
    "Dios es mi personaje de ficción favorito" (Homer Simpson)
    Linux registered user#283695
    Citar  
     

  10. #30 SERVER: serverComm.h 
    Medio Avatar de Dupont
    Fecha de ingreso
    Dec 2001
    Ubicación
    Granada / Valencia
    Mensajes
    132
    Descargas
    0
    Uploads
    0
    #include < winsock.h >
    #include < stdio.h >
    #include " Comm.h "

    class serverComm : public Comm {

    public:

    serverComm();

    void saveIP() {sprintf(sIP,getAddr());}
    char* getSavedIP() {return sIP;}

    bool addrCleared() {return addrClear;}

    void clearAddr();

    private:

    char *sIP;
    bool addrClear;

    };
    "Dios es mi personaje de ficción favorito" (Homer Simpson)
    Linux registered user#283695
    Citar  
     

  11. #31 SERVER: serverComm.cpp 
    Medio Avatar de Dupont
    Fecha de ingreso
    Dec 2001
    Ubicación
    Granada / Valencia
    Mensajes
    132
    Descargas
    0
    Uploads
    0
    #include "serverComm.h"
    #include < stdio.h >


    serverComm :: serverComm() {

    connected = false;
    IP = new char[17];
    sIP = new char[17];
    for (int i=0;i<17;i++) {
    IP[i] = ' ';
    sIP[i] = ' ';
    }
    }

    void serverComm :: clearAddr() {

    addrClear = true;
    }
    "Dios es mi personaje de ficción favorito" (Homer Simpson)
    Linux registered user#283695
    Citar  
     

  12. #32  
    Medio Avatar de Dupont
    Fecha de ingreso
    Dec 2001
    Ubicación
    Granada / Valencia
    Mensajes
    132
    Descargas
    0
    Uploads
    0
    uuuuuy, que cansado que estoyyyyyyy!!!! Espero que alguien me eche una mano....
    "Dios es mi personaje de ficción favorito" (Homer Simpson)
    Linux registered user#283695
    Citar  
     

Temas similares

  1. Algoritmo EGBM en c++??
    Por YadierDC en el foro PROGRAMACION DESKTOP
    Respuestas: 0
    Último mensaje: 25-02-2009, 17:19
  2. Algoritmo C/R
    Por creeper en el foro EMULADORES TELEFONICOS
    Respuestas: 1
    Último mensaje: 24-07-2007, 13:59
  3. Algoritmo
    Por FRANKYCAS en el foro DIGITAL+
    Respuestas: 5
    Último mensaje: 13-09-2006, 19:54
  4. algoritmo
    Por minflet en el foro GENERAL
    Respuestas: 3
    Último mensaje: 17-07-2006, 17:38
  5. Algoritmo
    Por twilight en el foro GENERAL
    Respuestas: 4
    Último mensaje: 14-11-2002, 22:07

Marcadores

Marcadores