Member 11351616 Ответов: 1

С++ клиент-сервер общения


клиент-сервер обменивается сообщениями с теми же компьютерами, но не работает с отдельными компьютерами.

Что я уже пробовал:

Client.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;
    }

Server.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;     
                            
    }

Jochen Arndt

Имеет ли сервер IP 192.168.56.1 и находится ли клиент в той же подсети (имеет IP 192.168.56.x)?

Member 11351616

Клиент и сервер должны быть одним и тем же Wi-Fi, но разными компьютерами.Так что ip-адрес моего клиента и ip-адрес сервера разные.Как я могу подключить сервер от клиента?

Jochen Arndt

На самом деле вы не ответили на мой вопрос.

Однако, когда они находятся в одной подсети, убедитесь, что:
- Клиент использует правильный IP-адрес сервера (при использовании Wi-Fi используйте IP-адрес интерфейса Wi-Fi)
- Нет брандмауэра, блокирующего ваши пакеты (проверьте на сервере и Wi-Fi маршрутизаторе)

Member 11351616

о'кей, я понял.Я это проверю.Также server_addr.sin_addr.s_addr = inet_addr(IP); когда я использую этот код на client.cpp , он не работает правильно. Можете ли вы проверить мой код ? Я новичок в C++, это мои первые коды.

Jochen Arndt

Что вы подразумеваете под "неправильной работой"?

Member 11351616

когда я использую ip-адрес(отличный от localhost) и запускаю код,клиент не подключается к серверу.Просто я получаю сообщение о создании клиентского сокета на терминале, обычно это должно быть подтверждение соединения, и я могу отправить сообщение на сервер.

Jochen Arndt

Это не цитируемая строка, которая терпит неудачу.
Что не удается, так это вызов connect().

Вы уже проверяете возвращаемое значение. Поэтому добавьте условие else, чтобы распечатать, что соединение не удалось.

Знать причины, проверка глобальной переменной errno (содержать ошибки.ч на вашего клиента файл) и распечатать значение. Строка сообщения об ошибке может быть получена путем передачи кода ошибки в strerror:

еще
{
int err = errno;
соиь <&ЛТ; "не удалось установить соединение с кодом" &ЛТ;&ЛТ; подстраховаться &ЛТ;&ЛТ; ": "&ЛТ;&ЛТ; strerror(заблуждайтесь) на << епси;
}

Распечатка должна помочь вам (и нам) сузить круг того, что происходит.

Member 11351616

я понимаю, что соединение не удалось с кодом 111:соединение отказано.

Jochen Arndt

Это означает, что никто не прослушивает удаленный адрес, но также может быть получен брандмауэром. Сервер все еще работает?

Чтобы проверить сетевое подключение, попробуйте выполнить пингинг сервера с клиента. В оболочке на клиенте введите (нажмите Ctrl+C на Linux, чтобы остановить)
пинг 192.168.56.1'

Если это не удается, то проблема связана с сетью, а не с вашей программой.

Arthur V. Ratz

5.

[no name]

Там не хватает какого-то кода. Вы связываете()-ing сокет сервера?

Member 11351616

да, я привязываю сокет сервера.Здесь я обновил свой код.Этот код работает в localhost.

Arthur V. Ratz

5.

Richard MacCutchan

Вы уверены, что локальный IP-адрес сервера 192.168.56.1? Когда ПК подключаются через Wi-Fi, их IP-адреса иногда меняются.

Member 11351616

да, я уверен, что это ip-адрес.

Richard MacCutchan

Ну, мы ничего не можем предположить из вышесказанного. Единственное, что нужно сделать, это получить с помощью вашего отладчика, чтобы точно проследить, что происходит, когда вы запускаете свой код. Основные сокетные соединения между ПК не так уж сложны, и до тех пор, пока адреса и номера портов верны, они должны просто работать.

Jochen Arndt

Вы действительно уверены?
Адрес .1 обычно занимает сам DHCP-сервер (например, маршрутизатор) и не назначается клиентам.

Чтобы узнать адрес, выполните команду "ipconfig" в командной строке Windows или "ifconfig" в командной строке оболочки Linux и найдите IP-адрес интерфейса Wi-Fi.

Arthur V. Ratz

5.

Arthur V. Ratz

Если вы пишете программу, которая выполняет чат клиент-сервер с использованием обычного текста, вам лучше реализовать службу, которая будет получать сообщения от клиентских приложений.

1 Ответов

Рейтинг:
2

leon de boer

Ответ на вопрос, почему он не будет работать на отдельных ПК, прост и не имеет ничего общего с вашим кодом.

Это называется брандмауэром вы используете порт 1500 вам нужно будет открыть этот порт на брандмауэрах на обоих компьютерах.

Предполагая, что вы находитесь на windows, (поиск подходит, если на linux):
Откройте порт в Брандмауэре Windows - справка Windows[^]