Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2017, 12:47   #1
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию Не получается узнать ip адрес удаленной стороны сокета

Перерыл в интернете все, но при попытке узнать ip адрес клиента он мне выдает 0.0.0.0. Помогите пожалуйста
Код:
//Стандартные библиотеки
#include <iostream>
#include <cstring>
#include <cstdlib>

//Классы
#include </etc/local/c++/server.class.cpp>
#include </etc/local/c++/client.class.cpp>

using namespace std;

//Переменные
Server server;
Client client;

int main(){
	while(client.sock=accept(server.sock, (struct sockaddr *)&client.config, client.size)){
		client.ip_init();
		cout<<"connect from "<<client.config.sin_addr.s_addr<<endl;
		shutdown(client.sock, 2);
		close(client.sock);
	}
	return 0;
}
server.class.cpp
Код:
//Стандартные библиотеки
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

using namespace std;

class Server{
public:
	int sock;
	struct sockaddr_in config;

	Server(){

		config.sin_family=AF_INET;
		config.sin_port=htons(80);
		config.sin_addr.s_addr=inet_addr("10.0.2.15");

		sock=socket(AF_INET, SOCK_STREAM, 0);
		bind(sock, (struct sockaddr *)&config, sizeof(config));
		listen(sock, 128);
	}
	~Server(){
		shutdown(sock, 2);
		close(sock);
	}

private:

};
client.class.cpp
Код:
//Стандартные библиотеки
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

#include <iostream>

using namespace std;

class Client{
public:
	int sock;
	struct sockaddr_in config;
	socklen_t * size;

	char *ip;

	Client(){}
	~Client(){}

	void ip_init(){
		ip=inet_ntoa(config.sin_addr);
	}

private:

};
Где то читал что в accept Надо третьим параметром передавать int, но тогда он жалуется на неудачное преобразование из socklen_t в int
Андрей Цапко вне форума Ответить с цитированием
Старый 07.09.2017, 12:51   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А где проверка возвращаемого accept на INVALID_SOCKET?
p51x вне форума Ответить с цитированием
Старый 07.09.2017, 14:39   #3
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

Спасибо. И в правду сокет выдавал ошибку. Сложно сказать что я её исправил, я в accept поставил NULL вторым и третьим параметром. Подскажите ,пожалуйста, из-за чего ошибка?
Андрей Цапко вне форума Ответить с цитированием
Старый 07.09.2017, 14:40   #4
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

и у меня почему то подключение вызывается 3 раза. Проходит 3 интерации цикла. С чем это может быть связанно?
P.S. с этим разобрался.
Андрей Цапко вне форума Ответить с цитированием
Старый 07.09.2017, 14:50   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вы хоть доки по используемым функциям читаете? Третий параметр у accept это размер структуры из второго параметра. А вы что передаете? Неинициализированную переменную... вот проверка и срабатывает.
p51x вне форума Ответить с цитированием
Старый 07.09.2017, 14:56   #6
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

В классе client инициализированна переменная size с типом socklen_t. Я передаю эту переменную третьим параметром.
Андрей Цапко вне форума Ответить с цитированием
Старый 07.09.2017, 15:01   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
class Client{
public:
	int sock;
	struct sockaddr_in config;
	socklen_t * size;

	char *ip;

	Client(){}
	~Client(){}

	void ip_init(){
		ip=inet_ntoa(config.sin_addr);
	}

private:

};
Покажите, где size присваивается размер sockaddr ? Не говоря уже о том, что раз это указатель то и память надо выделять.
p51x вне форума Ответить с цитированием
Старый 07.09.2017, 15:12   #8
Андрей Цапко
Пользователь
 
Регистрация: 10.04.2017
Сообщений: 66
По умолчанию

Огромное спасибо. Все заработало после выделения памяти). Получалось вот так
Код:
//Стандартные библиотеки
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

#include <iostream>

using namespace std;

class Client{
public:
	int sock;
	struct sockaddr_in config;
	socklen_t *size;

	char *ip;

	Client(){
		size=new socklen_t(sizeof(config));
	}
	~Client(){}

	void ip_init(){
		ip=inet_ntoa(config.sin_addr);
	}

private:

};

//Стандартные библиотеки
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

using namespace std;

class Server{
public:
	int sock;
	struct sockaddr_in config;

	Server(){

		config.sin_family=AF_INET;
		config.sin_port=htons(80);
		config.sin_addr.s_addr=inet_addr("10.0.2.15");

		sock=socket(AF_INET, SOCK_STREAM, 0);
		bind(sock, (struct sockaddr *)&config, sizeof(config));
		listen(sock, 128);
	}
	~Server(){
		shutdown(sock, 2);
		close(sock);
	}

private:

};

//Стандартные библиотеки
#include <iostream>
#include <cstring>
#include <cstdlib>

//Классы
#include </etc/local/c++/server.class.cpp>
#include </etc/local/c++/client.class.cpp>

using namespace std;

//Переменные
Server server;
Client client;
char response[]="HTTP/1.1 200 OK\r\n"
	"Date: Wed, 09 Aug 2017 19:33:44 GMT\r\n"
	"Server: LocalServer/1.0 (Ubuntu)\r\n"
	"CVary: Accept-Encoding\r\n"
	"Connection: Keep-aleave\r\n"
	"Content-Type: text/html; charset=UTF-8\r\n"
	"\r\n"
	"<!DOCTYPE html>"
	"<html lang=\"ru\">"
	"<head>"
	"<title>C++</title>"
	"</head>"
	"<body>"
	"<h1>Hello World!</h1>"
	"<h2>This is C++!</h2>"
	"</body>"
	"</html>";

int main(){
	while(client.sock=accept(server.sock, (struct sockaddr *)&client.config, client.size)){
		cout<<"Connect "<<endl;
		if(client.sock==-1){
			cout<<"Error"<<endl;
		}
		client.ip_init();
		cout<<client.ip<<endl;
		send(client.sock, response, sizeof(response), 0);
		shutdown(client.sock, 2);
		close(client.sock);
	}
	return 0;
}
Извините за столь глупые вопросы. Я только недавно начал изучать С++ и туго знаком с Английским
Андрей Цапко вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть функция, хочется узнать мнение со стороны OmegaBerkut C# (си шарп) 52 13.02.2017 11:18
PHP Узнать ip адрес gunsoy PHP 4 23.05.2011 05:18
Как узнать ip адрес Hichigo Общие вопросы C/C++ 5 06.08.2010 15:48
Как узнать IP адрес? AidarBik Работа с сетью в Delphi 2 11.07.2007 12:37
как узнать ip адрес зная mac адрес Roman Работа с сетью в Delphi 9 25.06.2007 12:39