2010-11-24 9 views
1

これは私の2番目の話です。クライアントが送信したものを出力する以下のようなサーバーアプリケーションを作成しました。私はクライアントがローカルホストに接続するように指定した場合、クライアントを使用してサーバに接続できるようにしているので、何かをlistenするserver.exeバージョンが1つあります。localhostではなくIPアドレスに接続していますか?

ローカルホストの代わりに自分のIPアドレスを使用すると、サーバーに接続できません。この方法でサーバーに接続することはできませんか。

私はINADDR_ANYを持たずに自分のIPアドレスを使用するようにハードコードされた別のSERVER.EXEを使用しますが、着信接続にbind()またはlisten()することができませんでした。私はどのように進めるのか混乱している。

(私は、同じマシン上のサーバとクライアントを実行していますが、その問題あり?)

サーバー

#include <iostream> 
#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
using namespace std; 

#define PORT 3490 
#define IP "118.93.0.164" 
#define BACKLOG 10 

const int winsockversion = 2; 

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

     struct sockaddr_in serv; 
     memset(&serv,0,sizeof serv); 
     serv.sin_family = AF_INET; 
     serv.sin_port = htons(PORT); 
     serv.sin_addr.s_addr = inet_addr(IP);//INADDR_ANY;//inet_addr(IP); 
     //--------------------------------------- 
     struct addrinfo serv_addrinfo; 
     serv_addrinfo.ai_family = AF_INET; 
     serv_addrinfo.ai_socktype = SOCK_STREAM; 
     serv_addrinfo.ai_protocol = IPPROTO_TCP; 
     serv_addrinfo.ai_addrlen = sizeof(serv); 
     serv_addrinfo.ai_addr = (sockaddr*)&serv; 


     //--------------------------------------- 
     SOCKET serv_con; 
     serv_con = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
     if (serv_con != INVALID_SOCKET){ 
      cout<<"-Server Socket created." << endl; 
     } 

     if (bind(serv_con,serv_addrinfo.ai_addr,serv_addrinfo.ai_addrlen) != -1){ 
      cout<<"-Binding Successful." << endl; 
     } 

     if(listen(serv_con,BACKLOG) != -1){ 
      cout<<"-Listening for incoming connections." << endl; 
     } 
     //-------------------------------------------------------------------- 
     SOCKET recv_socket; 
     struct sockaddr_in client_info; 
     int client_info_size = sizeof(client_info); 

     char *con_addr = inet_ntoa(client_info.sin_addr); 




     recv_socket = accept(serv_con,(sockaddr*)&client_info,&client_info_size); 

     if(recv_socket != INVALID_SOCKET){ 
      cout<<"-Connection Established!. " << endl; 
      cout<<"-Connected to: [" << con_addr << "] " << endl; 
     //---------------------------------------------------------------------- 
      char buffer[80]; 
      int bytes_in; 
      while(true){ 

       bytes_in = recv(recv_socket,buffer,sizeof(buffer),0); 
       if (bytes_in > 0){ 
        cout<<"[" << con_addr << "]" << buffer << endl; 
       } 

       if (bytes_in == 0){ 
        cout<<"[" << con_addr << "] has disconnected." << endl; 
        break; 
       } 
       if (bytes_in == -1){ 
        cout<<"-Possible Abrupt disconnecton from [" << con_addr << "]" << endl; 
        break; 
       } 
      } 

      closesocket(recv_socket); 
      closesocket(serv_con); 

     } 

    }else{ 
     cout<<"-WSAStartup Initialization failed." << endl; 
    } 

    if(WSACleanup()!= -1){ 
     cout<<"-WSACleanp Successful." << endl; 
    } 

    WSAGetLastError(); 


    return 0; 
} 

クライアント

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

#define PORT "3490" 
#define SERVER "118.93.0.164" // and 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; 
} 
+0

同じマシン上でサーバーとクライアントを実行することは間違いありません。私は使用しているIPアドレスがあなたのマシンが所有しているアドレスではないと思っています。あなたのサーバーはパブリックアドレスを持っていますか?またはプライベートアドレス? ipconfigコマンドで報告されたIPアドレスを与えてもよろしいですか? – Srikanth

+0

あなたは私のマシンのIPアドレスではなく、私のISPから提供されたIPアドレスです。私は複数のコンピュータをwifi経由で接続していますが、私は自分の外部IPに接続しようとしていました(私のISPから与えられたIPアドレスの名前ですか)。 – silent

+0

どのようにしてISPに接続してIPアドレスを与え、サーバが動作しているローカルアドレスを解決するのですか? (まだ専門用語に慣れていないのは申し訳ありません)。 – silent

答えて

4

ルータをお持ちの場合は、Port forwardingを設定する必要があります。それは本当にあなたが持っているルータの種類に依存するので、あなたはあなたの特定のもののためにそれを探す必要があります。

あなたのISPのIPアドレスを所有していないため、あなたのISPのIPアドレスにバインドすることはできません。お使いのコンピュータが実際に所有しているIPアドレスにはbindが必要です。これはWindowsのipconfig /allで見つけられます。次に、ご使用のサーバポート番号のルータで、ご使用のコンピュータにあるのIPアドレスにトラフィックを転送してください。

+0

@Default、これに関するガイドやチュートリアルはありますか?手動で行う必要なしに、自動的にやりたいと思っています。私はUPnPについて読んだことがあります。私はこれを打つことができるよく知られている場所はありますか?どんなスタートポジションでも大歓迎です。 – silent

+0

ガイドまたはチュートリアルは何ですか?ポートフォワーディング?または、サーバー/クライアントプログラムを作成して自動的にインターネットにバインドできるようにしたいですか?私が知ることはできないので、物事が起こったときに何をすべきかをHWに伝えなければなりません。コンピュータAにサーバがあり、コンピュータBにサーバがない場合、ルータはどのように知っていますか? AとBの両方にポートxのサーバーがある場合はどうなりますか?それでは、ルータは何をすべきですか?このため、手動で行う必要があります。 – Default

+0

あなたは他のプログラムがそれをどうやって行っているのだろうかと思うかもしれません。さて、彼らはインターネットでリッスンしているサーバーを持っています(使用しているサーバーはインターネットに直接接続されているか、ポートフォワーディングを持っています)。次に、コンピュータ間を接続するために、このサーバに接続し、2台のコンピュータ間で情報を「中継」します。しかし、これは本当に関連していない、ただのトリビアです。 – Default

0

あなたがするCMDを使用してみてくださいクライアント側からサーバーIPにpingして、接続の問題であるかどうかを確認します。ポートは整数でなければなりませんので、

さらに、私はクライアント側でこの

#define PORT "3490" 

と思うが間違っています。

+1

クライアントはgetaddrinfoを使用しており、これにはこれが必要です。 – silent

0

サーバに接続しようとしているときに、localhost/127.0.0.1を使用していますか、またはリッスンしているIPアドレスですか?

「localhost」に接続しようとすると、プログラムがリッスンしていないループバックインターフェイスを使用しようとしている可能性があります。私はWindowsでどのように動作するか100%確信していません。

あなたのデザインを変更するように求めるより重要な質問をすることができます。なぜ特定のIP(およびローカルホスト)にバインドしたいのですか?

+0

私の目的は、これまでの私のローカルネットワーク上で動作する単純なクライアント - サーバーチャット(画面上の種類の送信と印刷の多くはまだ)プログラムを書くことです。私がしたいことは、自分のネットワークの外にいる誰かがISPの割り当てられたIPアドレスを使って私のサーバーアプリケーションに接続しているのですか?これは本当に私がやりたいことです。 – silent

関連する問題