PDA

Visualizza la versione completa : [c++,LINUX] recv() e send() non inviano/ricevono dati


Rising1
26-09-2013, 15:01
ecco il codice del server:


#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


#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

Fusic86
26-09-2013, 16:25
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:
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:

Rising1
26-09-2013, 21:02
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:
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? :confused:

EDIT:

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

Rising1
27-09-2013, 15:34
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ù

Loading