Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C] applicazione client-server

    Salve ragazzi,
    ho un problemino da risolvere con una applicazione client sever, dovrei creare due programmi diciamo S e C che producano le seguenti azioni:
    - S apre una socket in ascolto ed aspetta connessioni
    - C prende due parametri da linea di comando: (1) il nome di un device dal quale leggere e (2) il numero di bytes da leggere e spedire ad S. Apre il device specificato, legge il numero di bytes specificati e mette i dati in un buffer ed infine apre una socket ad S e spedisceil contenuto del buffer ad S.
    - S legge i dati e li stampa e risponde a C con il numero di bytes letti ed i dati letti
    - C legge quanto arriva da S e stampa a video

    Il punto in cui mi sono fermato è il secondo, non ho proprio idea su come realizzarlo.

  2. #2
    nulla di nulla!

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    cosa non sai fare del secondo punto?
    non sai utilizzare gli argomenti del main per la riga del comando? non sai come aprire il device specificato?
    Posta anche il codice del primo punto, per sapere meglio come stai lavorando.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Non sei stato molto specifico cmq i passi da seguire sono piu o meno questi:

    - Passare i parametri da riga di comando
    main(int argc , char *argv[])
    dove arg è il numero dei parametri (puoi controllare che sia stato inserito il numero giusto)
    e *argv[] è un vettore di stringhe in cui sono memorizzatii comandi (separati da uno spazio).
    Il comando i-esimo lo individui con argv[i].

    -Aprire il device
    Hai bisogno di un handle per il tuo device.
    Che tipo di device è?

    -Aprire una socket ad S e spedire il contenuto del buffer ad S
    Qui devi semplicemente aprire un socket TCP immagino (se parli di connessione)
    sulla porta in cui è in ascolto il server e naturalmente spedire i dati.



    Se sei un pò più specifico , magari ti posso dire qualcosa in piu.

  5. #5
    Originariamente inviato da bigmickey
    Non sei stato molto specifico cmq i passi da seguire sono piu o meno questi:

    - Passare i parametri da riga di comando
    main(int argc , char *argv[])
    dove arg è il numero dei parametri (puoi controllare che sia stato inserito il numero giusto)
    e *argv[] è un vettore di stringhe in cui sono memorizzatii comandi (separati da uno spazio).
    Il comando i-esimo lo individui con argv[i].
    ok ok, scusami per la non precisazione ma questo passo va bene, so' come utilizzare i parametri. Grazie lo stesso.

    -Aprire il device
    Hai bisogno di un handle per il tuo device.
    Che tipo di device è?
    E' questo il punto cruciale, ti posto il testo dell'esercizio relativo a questo punto:

    Program "C" executes, takes as a command-line two parameters: (1) the name of a device from which to read, and (2) the number of bytes to read and send to the other process. Note that the name of a device is of the form "random", not "/dev/random", as local device naming conventions and access methodologies vary from operating system to operating system. The default device is "random" and the default number of bytes to read is 1024.
    Program "C" open the specified device, read the specified number of bytes from that device into a buffer.

    Scusate se e' in inglese, ma spero sia comunque abbastanza chiaro...

    Grazie

  6. #6
    A questo punto credo che bisogna sapere su che piattaforma lavori.

    Se sei su windows le funzioni dell' API che dovrebbe interessarti credo che siano
    DeviceIOControl , CreateFile , ReadFile .
    Ti permettono di entrare in comunicazione con il device driver, lo vedi come un file e lo leggi.
    A esempio con la porta seriale, puoi leggere e scrivere come se fosse un file.

  7. #7
    Originariamente inviato da XWolverineX
    cosa non sai fare del secondo punto?
    non sai utilizzare gli argomenti del main per la riga del comando? non sai come aprire il device specificato?
    Posta anche il codice del primo punto, per sapere meglio come stai lavorando.
    Ok ti posto il codice, premetto che il programma S relativo al primo punto dovrebbe essere una applicazione server, quindi sto' provando questo codice:

    Server:
    Codice PHP:
    #include <stdio.h>    
    #include <stdlib.h>    
    #include <sys/types.h>
    #include <sys/socket.h>    /* socket(), bind(), listen(), accept() */
    #include <netinet/in.h>
    #define PORT 4000
    int main (int argccharargv[])
    {
        
    int fdnewfdclen;
        
    struct sockaddr_in saddrcaddr;
        
    char command;
        
    char buf[1000];

        
    saddr.sin_family AF_INET;
        
    saddr.sin_addr.s_addr INADDR_ANY;
        
    saddr.sin_port htons((u_shortPORT);
        
        
    fd socket(AF_INETSOCK_STREAM0);
        
        
    bind(fd, (struct sockaddr *) &saddrsizeof(saddr));
        
    listen(fd5);
        
    printf("Waiting for connections...\n"); 
        
    newfd accept(fd, (struct sockaddr*) &caddr, &clen);

        
    printf("\n\nConnection accepted!\n");
        
        while(
    1) {

            
    recv(newfd, &command,1,0);
            
            switch(
    command) {
                case 
    'a':
                    
    printf("A");
                    
    //write(newfd, "A", strlen("A"));
                    //write(1, "A",strlen("A"));
                    
    send(newfd"A",1,0);
                    break;
                case 
    'b':
                    
    send(newfd"B",1,0);
                    break;
                default:
                    
    send(newfd"X",1,0);
                    break;    
            }

        }
        
    close(newfd);
        
    close(fd);
        
        return 
    0;

    con questo codice relativo al client:

    Codice PHP:
    #include <stdio.h>    
    #include <stdlib.h>    /* exit() */
    #include <sys/types.h>
    #include <sys/socket.h>    /* socket(), bind(), listen(), accept() */
    #include <netinet/in.h>
    #define PORT 4000

    int main (int argccharargv[])
    {
        
    int fderr;
        
    struct sockaddr_in saddr;
        
    char commandresult;
        
    char buf[1000];

        
    saddr.sin_family AF_INET;
        
    saddr.sin_port htons((u_shortPORT);
        
    saddr.sin_addr.s_addr inet_addr(argv[1]);

        
    fd socket(AF_INETSOCK_STREAM0);
        
    err connect(fd, (struct sockaddr *) &saddrsizeof(saddr));
        
        if (
    err == 0) {
        
    printf("sono qui!!!");
                    
        
    command getchar();
        
    send(fd, &command10);
        while (
    recv(fd, &result10) != 1)
            
    //do nothing
            
    printf("Sono qui!!");
            ;
        
    printf("%s",result);
        
    putchar (result);
        }
        
        else {
            
    printf ("Connection error\n");
            
    close(fd);
            exit(
    1);
        }
        
        
    close(fd);


    ma fino ad ora ho ottenuto dal server il messaggio di "connection accepted!", ma se invio i caratteri 'a' o 'b' o qualcos altro al server, non mi risponde!
    Questo codice in effetti non c'entra molto con l'esercizio che devo fare, ma e' solo per provare la comunicazione tra i processi, cosa questa importante per l'esercizio.

    Spero di non aver creato troppa confusione, come sono solito fare...

    Grazie

  8. #8
    Originariamente inviato da bigmickey
    A questo punto credo che bisogna sapere su che piattaforma lavori.

    Se sei su windows le funzioni dell' API che dovrebbe interessarti credo che siano
    DeviceIOControl , CreateFile , ReadFile .
    Ti permettono di entrare in comunicazione con il device driver, lo vedi come un file e lo leggi.
    A esempio con la porta seriale, puoi leggere e scrivere come se fosse un file.
    Sono su Linux

  9. #9
    Ti premetto che non ho mai sviluppato su linux,
    però in fondo i scoket sono sempre quelli di Berkley, ora do uno sguardo al codice.
    Nel frattempo ti consiglio di fare le cose una alla volta.
    Prima testa il server con un client sicuramente funzionante,
    una volta che sei sicuro che il server riceve e risponde,
    allora prova a mandare i comandi con un client tuo.

  10. #10
    C'è un ";" in più nel client, non so cosa possa fare...
    non è che non esce dal ciclo?


    codice:
    while (recv(fd, &result, 1, 0) != 1)
            //do nothing
            printf("Sono qui!!");
            ;                              <------------------------

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.