PDA

Visualizza la versione completa : [C++] IP client da comunicare al server


lcastello
14-11-2005, 17:13
Ciao a tutti, avrei bisogno di un piccolo aiuto. Sto costruendo un semplice prog client server con le winsock in c++ (come compilatore: borland c++ builder). Ci di cui ho bisogno che al momento in cui il clienti si connette, una volta ricevuto il mex di benvenuto dal server, invii il suo indirizzo ip, o altrimenti che il server ricavi l'ip del client al momento della sua connessione. In poche parole, in un modo o nell'altro ho bisogno che il server conosca l'ip della macchina del client.

Potete aiutarmi..............Grazie 1000


ciao :ciauz:

oregon
14-11-2005, 17:16
Non so come tu stabilisca la connessione nel tuo programma ma, se e' stabilita, il server conosce l'ip del client ...

lcastello
14-11-2005, 17:22
la connessione client server, ovvero il client conosce l'ip del server e la porta di connessione, una volta connesso il server come fa a conoscere l'ip del client ?

oregon
14-11-2005, 17:29
Te l'ho detto ... quale e' il codice in cui hai implementato la connessione?

lcastello
14-11-2005, 17:51
----------------------------------------
CLIENT:
----------------------------------------

SOCKET nuovosocket;

sockaddr_in nuovosocket_addr;
WSADATA data;

WORD p;
p=MAKEWORD(2,0);
err=WSAStartup(p,&data);


nuovosocket=socket(PF_INET,SOCK_STREAM,0); // inizializzo il socket
nuovosocket_addr.sin_family=PF_INET; // si usa il protocollo TCP/IP
nuovosocket_addr.sin_port=htons(porta); //la porta a cui connettersi
nuovosocket_addr.sin_addr.S_un.S_un_b.s_b1=127; // creo ip del server
nuovosocket_addr.sin_addr.S_un.S_un_b.s_b2=0;
nuovosocket_addr.sin_addr.S_un.S_un_b.s_b3=0;
nuovosocket_addr.sin_addr.S_un.S_un_b.s_b4=1;
lun=sizeof(struct sockaddr);
err=connect(nuovosocket,(struct sockaddr*)&nuovosocket_addr,lun);

n=recv(nuovosocket,mess,100,0); // messaggio di benvenuto dal Server



----------------------------------------
SERVER:
----------------------------------------

SOCKET primo, dati; //inizializzo i due socket

sockaddr_in primoadd, datiadd; //mi servono per impostare i socket

WSADATA data;
WORD ver;
ver=MAKEWORD(2,0);
err=WSAStartup(ver,&data);

printf("%s",&testo);


primo=socket(PF_INET,SOCK_STREAM,0); //specifico il tipo di socket
primoadd.sin_family=PF_INET;
primoadd.sin_port=htons(23); //setto la porta
primoadd.sin_addr.s_addr=INADDR_ANY; //accetto qualsiasi indirizzo
lun=sizeof(sockaddr);



err=bind(primo,(sockaddr*)&primoadd,sizeof(sockaddr_in));
err=listen(primo,backlog); //mi metto in ascolto
dati=accept(primo,(sockaddr*)&datiadd,LPINT(&lun));


send(dati,mex,len(mex),0); //invio il messaggio di benvenuto al client


-------------------------------------------

ecco il codice........
come faccio a sapere quale ip ha la macchina del client ?


grazie ancora

oregon
14-11-2005, 17:57
Devi esaminare la struttura

datiadd

che hai usato nell'accettare la connessione.

lcastello
14-11-2005, 18:00
potresti farmi un esempio perfavore ?
Perch non ci ho capito molto :dh:


grazie

oregon
14-11-2005, 19:16
Beh, ma allora come hai scritto il programma? :madai!?:

Quando scrivi

dati=accept(primo,(sockaddr*)&datiadd,LPINT(&lun));

perche' passi il puntatore alla struttura datiadd?
Il secondo parametro della accept e' :

"Optional pointer to a buffer that receives the address of the connecting entity, as known to the communications layer."

Quindi dovrebbe essere qualcosa del genere ...



char ip[50];
unsigned short port;
inet_ntop(AF_INET, &(((struct sockaddr_in *)datiadd)->sin_addr), ip, sizeof (ip));
port = ntohs(((struct sockaddr_in *)datiadd)->sin_port);
printf("IP %s PORT %hu\n", ip, port);

Loading