Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - IP del server e del client (winsock.h)
Forum - C/C++ - IP del server e del client (winsock.h)

Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 11:14
Sabato, 26/04/2008
ciao a tutti!
Dopo aver cercato dappertutto un esempio di programma che utilizzi le socket ne ho trovato uno qui:
http://www.swprog.com/articoli/csc_3.php

Il mio problema è che se lo utilizzo in locale (indirizzo ip server e client = 127.0.0.1) funziona, se invece metto un altro indirizzo ip per il server, quando lo lancio accetta subito una connessione da 227.194.191.*** [non so se sia sicuro scriverlo...] e riceve un messaggio di 2 caratteri.. come posso fare percheè accetti una sola connessione da chi voglio io (il mio client)?
i codici sono i seguenti:

server:
Codice sorgente - presumibilmente C++

  1. #include <winsock.h>
  2.    #include <string.h>
  3.    #include <iostream.h>
  4.    
  5.    main()
  6.    {
  7.    SOCKET listenSocket;
  8.    SOCKET remoteSocket;
  9.    SOCKADDR_IN Server_addr;
  10.    SOCKADDR_IN Client_addr;
  11.    int sin_size;
  12.    short port;
  13.    
  14.    char buffer[256];
  15.    
  16.    int wsastartup;
  17.    int ls_result;
  18.    
  19.    /* Inizializzazione della libreria Socket */
  20.    WORD wVersionRequested = MAKEWORD(2,2);
  21.    WSADATA wsaData;
  22.    wsastartup = WSAStartup(wVersionRequested, &wsaData);
  23.    if (wsastartup != NO_ERROR) cout<<"Errore WSAStartup()\n";
  24.    
  25.    /* Creazione della Socket che si porrà in ascolto di richieste del Client*/
  26.    listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  27.    if (listenSocket < 0)
  28.    cout<<"Server: errore nella creazione della socket.\n";
  29.    else cout<<"La Listening Socket è partita\n";
  30.    
  31.    /* Effettua la bind sull’indirizzo e porta ora specificati */
  32.    port = 4000;
  33.    Server_addr.sin_family = AF_INET;
  34.  
  35.  
  36.    
  37.    Server_addr.sin_addr.S_un.S_un_b.s_b1=127; // indico l'indirizzo IP
  38.    Server_addr.sin_addr.S_un.S_un_b.s_b2=0;
  39.    Server_addr.sin_addr.S_un.S_un_b.s_b3=0;
  40.    Server_addr.sin_addr.S_un.S_un_b.s_b4=1;
  41.    Server_addr.sin_port = htons(port);
  42.    
  43.    if (bind(listenSocket,(LPSOCKADDR)&Server_addr,sizeof(struct sockaddr)) < 0)
  44.    cout<<"Server: errore durante la bind.\n";
  45.    
  46.    /* La socket si pone in "ascolto" tramite la listen() */
  47.    ls_result = listen(listenSocket, SOMAXCONN);
  48.    if (ls_result < 0) cout<<"Server: errore durante la listen.\n";
  49.    else cout<<"La Socket è in Ascolto\n";
  50.    
  51.    /* La socket accetta la richiesta di connessione del Client */
  52.    sin_size = sizeof(struct sockaddr_in);
  53.    remoteSocket = accept(listenSocket, (struct sockaddr *)&Client_addr,&sin_size);
  54.    cout<<"Accettata Connessione con Client: "<<inet_ntoa(Client_addr.sin_addr)<<endl;
  55.    
  56.    /* Il Server accetta il messaggio dal Client */
  57.    
  58.    
  59.    recv(remoteSocket, buffer, sizeof(buffer), 0);
  60.    cout<<"Messaggio Arrivato: "<<buffer<<endl;
  61.    
  62.    cout<<"Chiudo il Server"<<endl;
  63.    closesocket(remoteSocket);
  64.    WSACleanup();
  65.    
  66.    system("pause");
  67.    return 0;
  68.    }



client:
Codice sorgente - presumibilmente C++

  1. #include <winsock.h>
  2. #include <string.h>
  3. #include <iostream.h>
  4. #include <stdlib.h>
  5. #include <conio.h>
  6.  
  7. int main()
  8. {
  9. SOCKET clientsocket;
  10. SOCKADDR_IN addr;
  11.  
  12. char messaggio[80],t;
  13. short port;
  14.  
  15. WORD wVersionRequested = MAKEWORD(2,2);
  16. WSADATA wsaData;
  17. WSAStartup(wVersionRequested, &wsaData);
  18.  
  19. port = 4000;
  20. addr.sin_family = AF_INET;
  21. addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  22. addr.sin_port = htons(port);
  23.  
  24. clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  25. if (connect(clientsocket, (LPSOCKADDR)&addr, sizeof(addr)) < 0)
  26. cout<<"Errore nella connessione con il Server"<<endl;
  27.  
  28. cout<<"Messaggio da Inviare: ";
  29. gets(messaggio);
  30. send(clientsocket,messaggio,sizeof(messaggio),0);
  31.  
  32. closesocket(clientsocket);
  33.  
  34. WSACleanup();
  35. system("pause");
  36. return 0;
  37. }



un enormee grazie a chi mi aiuterà!!
=John=


Costruisci come se dovesse durare 1000 anni, vivi come se fosse l'ultimo giorno....

Linux user #510634
PM Quote
Avatar
FHF93 (Ex-Member)
Pro


Messaggi: 132
Iscritto: 13/11/2007

Segnala al moderatore
Postato alle 11:42
Sabato, 26/04/2008
io ho scritto un articolo nella sezione tutorial se ti interessa .. comunque funziona in locale credo perchè apri la porta del server in locale , sul 127.0.0.1 e non accetta connessioni remote..
io sostituirei questo codice

Codice sorgente - presumibilmente Plain Text

  1. Server_addr.sin_addr.S_un.S_un_b.s_b1=127; // indico l'indirizzo IP
  2.    Server_addr.sin_addr.S_un.S_un_b.s_b2=0;
  3.    Server_addr.sin_addr.S_un.S_un_b.s_b3=0;
  4.    Server_addr.sin_addr.S_un.S_un_b.s



così..

Codice sorgente - presumibilmente Plain Text

  1. Server_addr.sin_addr.s_addr = INADDR_ANY;


Ultima modifica effettuata da FHF93 il 26/04/2008 alle 11:43


Fabrizio
Dio disse : "chi odia la scuola scagli la prima pietra" ... E così nacquero le montagne...
PM Quote
Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 15:24
Sabato, 26/04/2008
Funziona! un enorme grazie...

mi spiegeresti cosa ho cambiato in quel modo?
sono curioso di sapere la differenza tra i due pezzetti di codice...


Costruisci come se dovesse durare 1000 anni, vivi come se fosse l'ultimo giorno....

Linux user #510634
PM Quote
Avatar
FHF93 (Ex-Member)
Pro


Messaggi: 132
Iscritto: 13/11/2007

Segnala al moderatore
Postato alle 15:52
Sabato, 26/04/2008
con INADRR_ANY ricevi connessioni sul server da qualsiasi ip , connessioni remote , con 127.0.0.1 le ricevi solo in locale


Fabrizio
Dio disse : "chi odia la scuola scagli la prima pietra" ... E così nacquero le montagne...
PM Quote
Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 16:03
Sabato, 26/04/2008
ok. ho capito grazie ma ho fatto un test e non va...

vi spiego cosa ho fatto:
ho inviato il client con il codice per connettersi al mio ip (visto da www.whatismyip.com) ad un amico, ho lanciato il server modificato come ha detto Fabrizio e ho detto a lui di lanciare il client.
il problema è che lui non riesce a connettersi al server e io dal server non lo ricevo...
cosa erro? :-|


Costruisci come se dovesse durare 1000 anni, vivi come se fosse l'ultimo giorno....

Linux user #510634
PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 18:14
Sabato, 26/04/2008
Come ho gia' scritto tante volte su questo forum (perche' non fate delle ricerche?) il collegamento da client a server se questi stanno su internet dipende dalla visibilita' del server.

Se il server e' nattato tramite un router (ed esiste quindi un IP esterno e uno interno) bisogna configurare il router per il port forwarding dell'IP/porta coinvolti.

PM Quote
Avatar
M@d_Hacker (Ex-Member)
Expert


Messaggi: 254
Iscritto: 25/02/2008

Segnala al moderatore
Postato alle 20:19
Martedì, 29/04/2008
Vedi se questi link ti possono essere utili(non centrano con il c++)...

http://www.portforward.com/

http://it.wikipedia.org/wiki/Port_forwarding

PM Quote