Oppure

Loading
26/04/08 9:14
John
ciao a tutti!
Dopo aver cercato dappertutto un esempio di programma che utilizzi le socket ne ho trovato uno qui:
swprog.com/articoli/…

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:
   
   #include <winsock.h>
   #include <string.h>
   #include <iostream.h>
    
   main()
   {
   SOCKET listenSocket;
   SOCKET remoteSocket;
   SOCKADDR_IN Server_addr;
   SOCKADDR_IN Client_addr;
   int sin_size;
   short port;
    
   char buffer[256];
    
   int wsastartup;
   int ls_result;
    
   /* Inizializzazione della libreria Socket */
   WORD wVersionRequested = MAKEWORD(2,2);
   WSADATA wsaData;
   wsastartup = WSAStartup(wVersionRequested, &wsaData);
   if (wsastartup != NO_ERROR) cout<<"Errore WSAStartup()\n";
    
   /* Creazione della Socket che si porrà in ascolto di richieste del Client*/
   listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
   if (listenSocket < 0)
   cout<<"Server: errore nella creazione della socket.\n";
   else cout<<"La Listening Socket è partita\n";
    
   /* Effettua la bind sull’indirizzo e porta ora specificati */
   port = 4000;
   Server_addr.sin_family = AF_INET;
  
 
   
   Server_addr.sin_addr.S_un.S_un_b.s_b1=127; // indico l'indirizzo IP
   Server_addr.sin_addr.S_un.S_un_b.s_b2=0;
   Server_addr.sin_addr.S_un.S_un_b.s_b3=0;
   Server_addr.sin_addr.S_un.S_un_b.s_b4=1; 
   Server_addr.sin_port = htons(port);
    
   if (bind(listenSocket,(LPSOCKADDR)&Server_addr,sizeof(struct sockaddr)) < 0)
   cout<<"Server: errore durante la bind.\n";
    
   /* La socket si pone in "ascolto" tramite la listen() */
   ls_result = listen(listenSocket, SOMAXCONN);
   if (ls_result < 0) cout<<"Server: errore durante la listen.\n";
   else cout<<"La Socket è in Ascolto\n";
    
   /* La socket accetta la richiesta di connessione del Client */
   sin_size = sizeof(struct sockaddr_in);
   remoteSocket = accept(listenSocket, (struct sockaddr *)&Client_addr,&sin_size);
   cout<<"Accettata Connessione con Client: "<<inet_ntoa(Client_addr.sin_addr)<<endl;
    
   /* Il Server accetta il messaggio dal Client */
   
   
   recv(remoteSocket, buffer, sizeof(buffer), 0);
   cout<<"Messaggio Arrivato: "<<buffer<<endl;
    
   cout<<"Chiudo il Server"<<endl;
   closesocket(remoteSocket);
   WSACleanup();
    
   system("pause");
   return 0;
   }


client:
#include <winsock.h>
#include <string.h>
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
SOCKET clientsocket;
SOCKADDR_IN addr;
  
char messaggio[80],t;
short port;
 
WORD wVersionRequested = MAKEWORD(2,2);
WSADATA wsaData;
WSAStartup(wVersionRequested, &wsaData);

port = 4000;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(port);

clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (connect(clientsocket, (LPSOCKADDR)&addr, sizeof(addr)) < 0)
cout<<"Errore nella connessione con il Server"<<endl;

cout<<"Messaggio da Inviare: ";
gets(messaggio);
send(clientsocket,messaggio,sizeof(messaggio),0);

closesocket(clientsocket);

WSACleanup();
system("pause");
return 0;
}


un enormee grazie a chi mi aiuterà!!
=John=
aaa
26/04/08 9:42
FHF93
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

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


così..

Server_addr.sin_addr.s_addr = INADDR_ANY;
Ultima modifica effettuata da FHF93 26/04/08 9:43
aaa
26/04/08 13:24
John
Funziona! un enorme grazie...

mi spiegeresti cosa ho cambiato in quel modo?
sono curioso di sapere la differenza tra i due pezzetti di codice...
aaa
26/04/08 13:52
FHF93
con INADRR_ANY ricevi connessioni sul server da qualsiasi ip , connessioni remote , con 127.0.0.1 le ricevi solo in locale
aaa
26/04/08 14:03
John
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 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? :-|
aaa
26/04/08 16:14
gantonio
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.
aaa
29/04/08 18:19
M@d_Hacker
Vedi se questi link ti possono essere utili(non centrano con il c++)...

portforward.com/

it.wikipedia.org/wiki/…
aaa