PDA

Visualizza la versione completa : [C++] Connettersi a un altro computer tramite Winsock


bonino33
12-04-2012, 14:33
salve,

bossibile connettersi a un altro computer non connesso al tuo router attraverso le WinSock??
se s, come??

wais87
12-04-2012, 14:42
Non mi chiarissimo cosa intendi fare..winsock una libreria utilizzata in casa microsoft per semplificare l'utilizzo dei protocolli dello stack tcp/ip..winsock utilizza naturalmente i socket; i socket altro non sono che dei canali tramite i quali due processi, su due macchine fisiche separate, possono comunicare utilizzando una porta..

come si fa? http://shoe.bocks.com/net/
o tanti altri tutorial che si trovano in giro..

bonino33
12-04-2012, 14:51
intendevo dire che se tu dai il programma client ad un tuo amico e tu sei il sever, lui inserendo il mio ip remoto no riesce a connettersi.

c' un modo per connettersi usando l'ip remoto??

lolide
12-04-2012, 15:47
Come t'hanno detto devi procedere con i Socket (WinSock su windows) e creare un server e un client. Poi se il tuo "server" e' raggiungibile tramite IP pubblico su internet, tramite il tuo client ti riuscirai a connettere al "server" usando IP e porta.

bonino33
12-04-2012, 16:18
come faccio a rendere possibile da utilizzare l'ip pubblico??

Caiodark
12-04-2012, 16:49
Parto dall'assunto che tu sia strasicuro che client e server funzionino (in tal caso client e server lanciati nel tuo computer devono funzionare).
Se la porta che hai usato per il tuo server non una standard internet (p.e. la 80) probabile che un firewall qualunque (quello del tuo router, quello del tuo SO, etc.) la stia bloccando.

oregon
12-04-2012, 20:26
Originariamente inviato da bonino33
bossibile connettersi a un altro computer non connesso al tuo router attraverso le WinSock??
se s, come??




come faccio a rendere possibile da utilizzare l'ip pubblico??

Probabilmente hai le idee confuse ... qual la domanda?

Quale difficolt hai?

E soprattutto, quale codice hai scritto? Cosa non va?

bonino33
12-04-2012, 20:28
Originariamente inviato da Caiodark
Parto dall'assunto che tu sia strasicuro che client e server funzionino (in tal caso client e server lanciati nel tuo computer devono funzionare).
Se la porta che hai usato per il tuo server non una standard internet (p.e. la 80) probabile che un firewall qualunque (quello del tuo router, quello del tuo SO, etc.) la stia bloccando.

come mai quando creo il sockets accendendo il server e usando la porta 80 non me lo crea??'

oregon
12-04-2012, 20:47
Originariamente inviato da bonino33
come mai quando creo il sockets accendendo il server e usando la porta 80 non me lo crea??'

Se non fai vedere il codice non avrai molte risposte ...

bonino33
12-04-2012, 21:03
main.cpp:


#include <iostream>
#include "C:\Users\JeanDenajar\Desktop\socket\Socket.h"
#pragma comment(lib, "ws2_32.lib")
using namespace std;

int main()
{
int scelta;
int port = 80;
//char *ipAddress = "127.0.0.1";
char ipaddress[456];
string ipAddress;
bool done = false;
char recMessage[STRLEN];
char sendMessage[STRLEN];
cout<<"1) fai host"<<endl;
cout<<"2) entra nel server"<<endl;
cout<<"3) esci"<<endl;
cin>>scelta;
if ( scelta == 3 )
exit(0);
else if ( scelta == 2 )
{

//Client
cout<<"Inserisci l'IP: ";
cin>>ipaddress;
ipAddress = ipaddress;
cout << ipaddress;
ClientSocket sockClient;
cout<<"Attendi..."<<endl;
sockClient.ConnectToServer( ipAddress.c_str(), port );
//Connected
while ( !done )
{
sockClient.GetAndSendMessage();
cout<<"\t--aspetta--"<<endl;
sockClient.RecvData( recMessage, STRLEN );
cout<<"ricevuto > "<<recMessage<<endl;
if ( strcmp( recMessage, "end" ) == 0 || strcmp( sendMessage, "end" ) == 0 )
{
done = true;
}
}
sockClient.CloseConnection();
}
else if ( scelta == 1 )
{
//SERVER
ServerSocket sockServer;
cout<<"attendo connessione client..."<<endl;
sockServer.StartHosting( port );
//Connected
while ( !done )
{
cout<<"\t--aspetta--"<<endl;
sockServer.RecvData( recMessage, STRLEN );
cout<<"Ricevuto > "<<recMessage<<endl;
sockServer.GetAndSendMessage();
if ( strcmp( recMessage, "end" ) == 0 ||
strcmp( sendMessage, "end" ) == 0 )
{
done = true;
}
}
}
}

Sokets.cpp:


#include "Socket.h"

Socket::Socket()
{
if( WSAStartup( MAKEWORD(2, 2), &wsaData ) != NO_ERROR )
{
cerr<<"impossibile inizializzare\n";
system("pause");
WSACleanup();
exit(10);
}

//Create a socket
mySocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

if ( mySocket == INVALID_SOCKET )
{
cerr<<"Socket Initialization: Error creating socket"<<endl;
system("pause");
WSACleanup();
exit(11);
}

Backup = mySocket;
}

Socket::~Socket()
{
WSACleanup();
}

bool Socket::SendData( char *buffer )
{
send( mySocket, buffer, strlen( buffer ), 0 );
return true;
}

bool Socket::RecvData( char *buffer, int size )
{
int i = recv( mySocket, buffer, size, 0 );
buffer[i] = '\0';
return true;
}

void Socket::CloseConnection()
{

closesocket( mySocket );
mySocket = Backup;
}

void Socket::GetAndSendMessage()
{
char message[STRLEN];
cin.ignore();
cout<<"Inviato > ";
cin.get( message, STRLEN );
SendData( message );
}

void ServerSocket::StartHosting( int port )
{
Bind( port );
Listen();
}

void ServerSocket::Listen()
{


if ( listen ( mySocket, 1 ) == SOCKET_ERROR )
{
cerr<<"Errore server\n";
system("pause");
WSACleanup();
exit(15);
}

acceptSocket = accept( Backup, NULL, NULL );
while ( acceptSocket == SOCKET_ERROR )
{
acceptSocket = accept( Backup, NULL, NULL );
}
mySocket = acceptSocket;
}

void ServerSocket::Bind( int port )
{
myAddress.sin_family = AF_INET;
myAddress.sin_addr.s_addr = inet_addr( "0.0.0.0" );
myAddress.sin_port = htons( port );



if ( bind ( mySocket, (SOCKADDR*) &myAddress, sizeof( myAddress) ) == SOCKET_ERROR )
{
cerr<<"Errore server\n";
system("pause");
WSACleanup();
exit(14);
}
}

void ClientSocket::ConnectToServer( const char *ipAddress, int port )
{
myAddress.sin_family = AF_INET;
myAddress.sin_addr.s_addr = inet_addr( ipAddress );
myAddress.sin_port = htons( port );

//cout<<"CONNECTED"<<endl;

if ( connect( mySocket, (SOCKADDR*) &myAddress, sizeof( myAddress ) ) == SOCKET_ERROR )
{
cerr<<"impossibil connttersi\n";
system("pause");
WSACleanup();
exit(13);
}
}


Sockets.h :


#include "WinSock2.h"

using namespace std;

const int STRLEN = 256;

class Socket
{
protected:
WSADATA wsaData;
SOCKET mySocket;
SOCKET Backup;
SOCKET acceptSocket;
sockaddr_in myAddress;
public:
Socket();
~Socket();
bool SendData( char* );
bool RecvData( char*, int );
void CloseConnection();
void GetAndSendMessage();
};

class ServerSocket : public Socket
{
public:
void Listen();
void Bind( int port );
void StartHosting( int port );
};

class ClientSocket : public Socket
{
public:
void ConnectToServer( const char *ipAddress, int port );
};

Loading