【解決方法】C++ サーバー クライアント チャット

プログラミングQA


クライアントサーバーは同じPCにメッセージを送信しますが、別のコンピューターでは機能しません。

私が試したこと:

クライアント.cpp

#include<iostream>
#include<string.h>
#include
#include
#include
#include
#include<stdlib.h>
#include<unistd.h>
#include<netdb.h>
using namespace std;

#define IP "192.168.56.1"
int main(){
     int client,server;
    int portNum=1500;
    bool isExit=false;
    int bufsize=1024;
    char buffer[bufsize];

   // char *ip= "192.168.1.101";
     struct sockaddr_in server_addr;
     client=socket(AF_INET,SOCK_STREAM,0);
     
     if(client<0){
        cout<< "Error createing socket." <<endl;
        exit(1);
        
        }
        
         cout<< "Client Socket created." <<endl;
        server_addr.sin_family=AF_INET;
        
     server_addr.sin_addr.s_addr = inet_addr(IP);
        server_addr.sin_port=htons(portNum);
        if (connect(client,(struct sockaddr *)&server_addr, sizeof(server_addr)) == 0)
        cout << "=> Connection to the server " << inet_ntoa(server_addr.sin_addr) << " with port number: " << portNum << endl; 
             recv(client,buffer,bufsize,0);
             cout<< "Connection confirmed." <<endl;
            cout<< "Enter # to end the connection." <<endl;
            
            do{
                 cout<< "Client:" << " " ;
                 do{
                     cin >> buffer;
                send(client,buffer,bufsize,0);
                 if(*buffer=='#'){
                                send(client,buffer,bufsize,0);
                                *buffer='*';
                                isExit=true;
                                }
                 }while(*buffer != 42);
                  cout<< "Server:  " << " " ;
                   do{
                                 recv(client,buffer,bufsize,0);
                                   cout<< buffer << " ";
                                    if(*buffer=='#'){
                                        *buffer='*';
                                        isExit=true; 
                                        
                                        }
                   }while(*buffer != 42);
                   cout << endl;
            }while(!isExit);
              cout<< "Connection terminated." <<endl; 
                close(client);
                return 0;
    }

サーバー.cpp

#include<iostream>
#include<string.h>
#include
#include
#include
#include<stdlib.h>
#include<unistd.h>
#include

#define IP "127.0.0.1"

using namespace std;
int main(){
    
    int client,server;
    int portNum=1500;
    bool isExit=false;
    int bufsize=1024;
    char buffer[bufsize];
    struct sockaddr_in server_addr;
    socklen_t size;
    client=socket(AF_INET,SOCK_STREAM,0);
    if(client<0){
        cout<< "Error establishing connection." <<endl;
        exit(1);
        
        }
        cout<< "Server Socket connection created." <<endl;
        server_addr.sin_family=AF_INET;
        server_addr.sin_addr.s_addr = htons(INADDR_ANY);
        server_addr.sin_port= htons(portNum);
        
        //binding socket
        
        if(bind(client, (struct sockaddr*)&server_addr,sizeof(server_addr))<0){
             cout<< "Error binding socket." <<endl;
             exit(1);
            }
            size=sizeof(server_addr);
            cout<< "Looking for clients" <<endl;
        //listening socket
        
            listen(client,1);
        //accept client
        
            server = accept(client,(struct sockaddr*)&server_addr,&size);
            if(server<0){
                cout<< "Error on accepting." <<endl;
             exit(1);
                
                }
                
                while(server>0){
                    
                    strcpy(buffer,"Server connected..\n");
                    send(server,buffer,bufsize,0);
                    cout<< "Connected with client." <<endl;
                    cout<< "Enter # to end the connection." <<endl;
                    cout<< "Client: " << " " ;
                    
                     do{
                        recv(server,buffer,bufsize,0);
                        cout<< buffer << " ";
                        if(*buffer=='#'){
                            *buffer='*';
                            isExit=true;
                            }
                        }while(*buffer!= '*');
                          
                       
                        do{
                            cout << "\nServer:" <<  " ";
                            do{
                                cin>>buffer;
                                send(server,buffer,bufsize,0);
                                 if(*buffer=='#'){
                                send(server,buffer,bufsize,0);
                                *buffer='*';
                                isExit=true;
                                }
                            }while(*buffer != '*');
                            
                             cout<< "Client:  " << " " ;
                             do{
                                 recv(server,buffer,bufsize,0);
                                   cout<< buffer << " ";
                                    if(*buffer=='#'){
                                        *buffer='*';
                                        isExit=true; 
                                        
                                        }
                                 }while(*buffer != '*');
                            
                        }while(!isExit);
                 cout<< "Connection terminated." <<endl; 
                 isExit=false;
                 exit(1) ;
             }
close(client);
return 0;     
                            
    }

解決策 1

別の PC で動作しない理由に対する答えは簡単で、コードとは関係ありません。

ポート 1500 を使用しているのはファイアウォールと呼ばれ、両方の PC のファイアウォールでそのポートを開く必要があります。

あなたがWindowsを使用していると仮定すると、(Linuxの場合は適切に検索してください):
Windows ファイアウォールでポートを開く – Windows ヘルプ[^]

解決策 59

I guess that your server app was in virtualbox's guest OS with NAT, 
in that mode, the host OS (your 'real' windows) cannot connect to the guest OS's, 
but you can open a port in virtualbox to fix it. (that's NAT) 

設定画面

コメント

タイトルとURLをコピーしました