2010-11-23 6 views
0

Dies ist wahrscheinlich trivial, aber ich brauche Hilfe, damit mein Server auf meinem ISP IP-Adresse statt der localhost in meinem Client-Server-Message-Programm zu hören. Mein Server und mein Client sind wie folgt.Wie mache ich meine Server-Anwendung verwenden meine IP-Adresse anstelle von localhost

Server

/*Server */ 
#define _WIN32_WINNT 0x501 
#include <iostream> 
#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
using namespace std; 

const int winsock_version = 2; 
#define PORT "3490" 
#define MAX_NUM_CONNECTIONS 10 

int main(void){ 

    WSADATA wsadata; 

    if (WSAStartup(MAKEWORD(winsock_version,0),&wsadata) == 0){ 
     cout<<"-WSAStartup Initialized." << endl; 

     struct addrinfo hints,*res; 
     int sock_fd; 

     memset(&hints,0,sizeof hints); 
     hints.ai_family = AF_UNSPEC; 
     hints.ai_socktype = SOCK_STREAM; 
     hints.ai_flags = AI_PASSIVE; 

     if (getaddrinfo(NULL,PORT,&hints,&res) != 0){ 
      cout<<"-Call to getaddress was unsucceful." << endl; 
     } 

     if((sock_fd = socket(res->ai_family,res->ai_socktype,res->ai_protocol)) == -1){ 
      cout<<"-Unable to Create socket." << endl; 
     } 

     if ((bind(sock_fd, res->ai_addr, res->ai_addrlen)) != -1){ 
      cout<<"-binding successful." << endl; 
     } 

     if ((listen(sock_fd,MAX_NUM_CONNECTIONS)) != -1){ 
      cout<<"-Listening for incoming connections." << endl; 
     } 
     //------------------------------------------------------------- 

     struct sockaddr_storage incming_info; 
     socklen_t sin_size; 
     sin_size = sizeof incming_info; 

     int new_fd; 

     new_fd = accept(sock_fd, (struct sockaddr*)&incming_info,&sin_size); 
     if (new_fd == -1){ 
      cout<<"-Accepting error." << endl; 
     } 
     if(new_fd == INVALID_SOCKET){ 
      cout<<"-INVALID SOCKET ERROR." << endl; 
     } 
     char buffer[128]; 
     while(true){ 
      int ret_val; 

      ret_val = recv(new_fd,buffer,sizeof(buffer),0); 
      if(ret_val == -1){ 
       cout<<"Receiving Error." << endl; 
       break; 
      }else if(ret_val == 0){ 
       cout<<"Connection has been closed!." << endl; 
       break; 
      }else{ 
       cout<<"Server: " << buffer<< endl; 
      } 
     } 
     cout<<"-Closing connection" << endl; 
     closesocket(new_fd); 

    }else{ 
     cout<<"-WSAStartup Initialization failed." << endl; 
     if(WSACleanup()!=0){ 
      cout<<"-WSACleanup Successful." << endl; 
     }else{ 
      cout<<"-WSACleanup Failed." << endl; 
     } 
    } 
    return 0; 
} 

Client

/*client*/ 
#define _WIN32_WINNT 0x501 
#include <iostream> 
#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
using namespace std; 

#define PORT "3490" 
#define SERVER "localhost" 
const int winsockVersion = 2; 


int main(void){ 

    WSADATA wsadata; 
    if ((WSAStartup(MAKEWORD(2,0),&wsadata)) == 0){ 
     cout<<"-WSAStartup Initialized." << endl; 

     struct addrinfo hints, *res; 
     int sockfd; 

     memset(&hints,0,sizeof hints); 
     hints.ai_family = AF_UNSPEC; 
     hints.ai_socktype = SOCK_STREAM; 

     if (getaddrinfo(SERVER,PORT,&hints,&res) != 0){ 
      cout<<"-getaddrinfo unsuccessful." << endl; 
     } 

     if ((sockfd = socket(res->ai_family,res->ai_socktype,res->ai_protocol)) == -1){ 
      cout<<"-Unable to create socket." << endl; 
     } 

     if ((connect(sockfd,res->ai_addr,res->ai_addrlen)) != -1){ 
      cout<<"-Connection Established." << endl; 
     } 

     cout<<"-Client connecting to: " << res->ai_addr << endl; 

     while(true){ 
      string text_buff; 
      cout<<"Enter text: "; 
      getline(cin,text_buff); 
      if((send(sockfd,text_buff.c_str(),text_buff.length()+1,0)) != -1){ 
       cout<<"-text_buff sent!." << endl; 
      } 

     } 

    }else{ 
     cout<<"-WSAStartup Initialization failed." << endl; 
     if(WSACleanup()!=0){ 
      cout<<"-WSACleanup Successful." << endl; 
     }else{ 
      cout<<"-WSACleanup Failed." << endl; 
     } 
    } 

    return 0; 
} 

Ich weiß, wie (ich glaube), um die Kunden, um zu spezifizieren, um es zu meiner IP-Adresse XXX.XX.XXX.XX zu machen zu verbinden, indem der SERVER in client.cpp, aber ich bin mir nicht sicher, wie man den Server dazu bringt, darauf zu hören ?.

Antwort

1

einen Blick hier nehmen:

C++ strange socket data

dieser Zeile:

addrinfo.sin_addr.s_addr = INADDR_ANY; 

gibt jede Adresse. Siehe hier:

für getaddrinfo wenn Sie eine bestimmte IP-Adresse oder einen Hostnamen anstelle von jeder verwenden möchten.

+0

ja Ich habe versucht, meine IP-Adresse in getaddrinfo, aber wenn ich den Server ausführen, bekomme ich einen Fehler in accept() ing, und dies führt zu dem Programm, die Verbindung zu schließen. – silent

+0

+1 für die INADDR_ANY. @ sil3nt: Wenn Sie kein Problem damit haben, alle Netzwerke zu hören, die Sie haben, können Sie INADDR_ANY verwenden. – Default

+0

@Default, immer noch nicht funktioniert, ich werde versuchen, dies ohne getaddrinfo und packen alles von Hand und sehen, wie es geht. – silent

0

getaddrinfo nimmt als erste Option die Identität des Servers - das könnte ein Name sein, den Sie in der DNS oder einer IP-Adresse nachschlagen können.

Wenn Sie null auf Ihrer Server-Seite angeben, bedeutet dies localhost, auf dem Client, den Sie speziell für den lokalen Host festgelegt haben.

The MSDN doc

Die Funktion Ihre Verwendung wird eine Liste der möglichen addrinfo berichten, passieren Sie die erste zu verbindlich.
Im Moment haben Sie angedeutet, dass Sie einen Stream wollen. Der Rest hängt vom Resolver ab, also bekommst du auf allen ips für Localhost (Loopback, Wireless, Ether, Wan) und jedem Port, auf ipv4 und ipv6 Zeug.

Sie müssen genauer auf Ihre Hinweise eingehen oder diese Funktion überspringen und den Port und die Adresse direkt angeben.

+0

Hallo, ja, ich habe versucht, 'getaddrinfo' auf meine IP-Adresse zu setzen, ohne AI_PASSIVE zu haben.Aber wenn ich das tue, erhalte ich einen Fehler, wenn accept() ing, was zu einem Fehler beim Erstellen eines Sockets und Empfangen führt, und das Programm schließt danach die Verbindung. Das alles passiert, sobald ich den Server gerade starte. – silent

+0

AI_NUMERICHOST? –

+0

Ich habe das versucht, immer noch nicht funktioniert. – silent

Verwandte Themen