С++ клиент-сервер общения
клиент-сервер обменивается сообщениями с теми же компьютерами, но не работает с отдельными компьютерами.
Что я уже пробовал:
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
Если вы пишете программу, которая выполняет чат клиент-сервер с использованием обычного текста, вам лучше реализовать службу, которая будет получать сообщения от клиентских приложений.