Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156

    [c++,LINUX] recv() e send() non inviano/ricevono dati

    ecco il codice del server:

    codice:
    #include <sys/types.h>
    #include <sys/socket.h>
            #include <iostream>
            #include <string>
            #include <stdlib.h>
            #include <stdio.h>
            #include <string.h>
            #include <errno.h>
    #include <netinet/in.h>
    
    using namespace std;
    
    int main()
    {
    
    
    //creazione socket
    int sockid;
    if ((sockid=socket(AF_INET,SOCK_STREAM,0))<0) cout<<"errore creazione\n"; else cout<<"socket: "<<sockid<<endl;
    
    
    //creazione struttura
    sockaddr_in servaddr;
    bzero((char *) &servaddr, sizeof(servaddr)); //azzeramento
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(5001);
    servaddr.sin_addr.s_addr=INADDR_ANY;  //indirizzo qualsiasi
    
    //binding
    if (bind(sockid, (struct sockaddr *) &servaddr, sizeof(struct sockaddr))==-1) cout<<"errore di binding "<<(errno)<<endl; else cout<<"binding effettuato\n";
    //prove
    
    //fine
    
    
    //creo struttura del client
    sockaddr_in clientaddr;
    int clientid;  //nuovo id del client
    unsigned int dimensionid=sizeof(clientaddr); //dimensione della struttura
    //ascolto
    listen(sockid,1);
    cout<<"ascolto effettuato\n";
    //accetto
    clientid=accept(sockid,(sockaddr *) &clientaddr,&dimensionid); //trasformerà clientaddr e dimensionid in quelli del client
    if(clientid<0) cout<<"errore di accept\n";else cout<<clientid<<endl;
    char a[5];
    strncpy(a,"nope",sizeof(a));
    cout<<"provo a ricevere\n";
    recv(sockid,a,sizeof(a),0);
    cout<<"risposta "<<a;
    
    getchar();
    }
    client
    codice:
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
            #include <iostream>
            #include <string.h>
            #include <stdlib.h>
            #include <stdio.h>
            #include <strings.h>
            #include <errno.h>
    #include <netinet/in.h>
    #include <netdb.h>
    using namespace std;
    
    int main(){
    
    int sockid;
    if ((sockid=socket(AF_INET,SOCK_STREAM,0))<0) cout<<"errore creazione\n"; else cout<<"socket: "<<sockid<<endl;
    
    //ottengo l'indirizzo locale del server a partire dal "nome"
    hostent *hp;
    hp = gethostbyname("il mio indirizzo ip publico"); //
    
    //creo la struttura per il server
    sockaddr_in servaddr;
    bzero((char *) &servaddr, sizeof(servaddr)); //azzeramento
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(5001);
    bcopy( (char*)hp->h_addr,(char*)&servaddr.sin_addr.s_addr,hp->h_length );
    //connetto
    if (connect(sockid,(struct sockaddr *) &servaddr,sizeof(servaddr)) < 0) cout<<"errore di connessione\n"; else cout<<"connesso\n";    //<-- compare!
    char a[5];
    strncpy(a,"hy!",sizeof(a));
    cout<<"provo ad inviare\n";
    send(sockid,a,sizeof(a),0);
    
    getchar();
    
    //sleep(10);
    
    }
    la connessione si stabilisce (viene stampato "connesso").
    il fatto è che il server non riceve affatto il messaggio (viene stampato sempre "nope");

    lavoro su un linux 32 bit. compilatore gcc, ide Codeblocks

  2. #2
    Ok, arrivando a stampare la risposta significa che le varie connessioni funzionano(o almeno cosi sembra essendo le chiamate a send e recv bloccanti).
    Detto questo da una prima occhiata posso intanto dirti che manca la finalizzazione del buffer a, ma non credo che sia questo il problema.

    Dopo questa operazione:
    codice:
    recv(sockid,a,sizeof(a),0);
    Devi contare le posizioni di a e assegnare uno 0 a quella finale.
    Non so se recv() in C++ come read() in C ritorna il numero di bytes letti.
    in quel caso basterebbe fare:
    Int nbytes= recv(....);
    a[nbytes]=0:

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    Originariamente inviato da Fusic86
    Ok, arrivando a stampare la risposta significa che le varie connessioni funzionano(o almeno cosi sembra essendo le chiamate a send e recv bloccanti).
    Detto questo da una prima occhiata posso intanto dirti che manca la finalizzazione del buffer a, ma non credo che sia questo il problema.

    Dopo questa operazione:
    codice:
    recv(sockid,a,sizeof(a),0);
    Devi contare le posizioni di a e assegnare uno 0 a quella finale.
    Non so se recv() in C++ come read() in C ritorna il numero di bytes letti.
    in quel caso basterebbe fare:
    Int nbytes= recv(....);
    a[nbytes]=0:
    fatto e.. ci sono rimasto male recv restituisce -1 . e ora dove sarà il problema?

    EDIT:

    errore STUPIDISSIMO
    nel server, quando devo ricevere, come argomento 1 di recv() passo l'id del socket del server e non del client

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    ne approfitto però per chiedere un'altra cosa.

    un codice del genere potrebbe essere compilato su macOSX? so che alcune librerie sono compatibili, o comunque c'è una certa portabilità tra i programmi scritti per linux e quelli per macos (essendo entrambi unix like)
    bisogna attuare degli accorgimenti? lo chiedo fondamentalmente perchè non ho un mac con cui provare, e mi piacerebbe saperne di più

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 © 2024 vBulletin Solutions, Inc. All rights reserved.