Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 07.09.2017, 13:47   #1
Андрей Цапко
Форумчанин
 
Регистрация: 10.04.2017
Сообщений: 64
Репутация: 10
По умолчанию Не получается узнать 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, 13:51   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 10,882
Репутация: 1806

icq: 216409213
По умолчанию

А где проверка возвращаемого accept на INVALID_SOCKET?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 07.09.2017, 15:39   #3
Андрей Цапко
Форумчанин
 
Регистрация: 10.04.2017
Сообщений: 64
Репутация: 10
По умолчанию

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

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

icq: 216409213
По умолчанию

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

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

icq: 216409213
По умолчанию

Код:

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, 16:12   #8
Андрей Цапко
Форумчанин
 
Регистрация: 10.04.2017
Сообщений: 64
Репутация: 10
По умолчанию

Огромное спасибо. Все заработало после выделения памяти). Получалось вот так
Код:

//Стандартные библиотеки
#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;
}

Извините за столь глупые вопросы. Я только недавно начал изучать С++ и туго знаком с Английским
Андрей Цапко вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть функция, хочется узнать мнение со стороны OmegaBerkut C# (си шарп) 52 13.02.2017 12: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


23:39.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru