Как стать автором
Обновить

Комментарии 10

НЛО прилетело и опубликовало эту надпись здесь
Мне нужен!
И уверен другим может пригодиться.
Poco идет под свободной лицензией Boost Software License

https://ru.wikipedia.org/wiki/Boost_Software_License

На счет ваше реализации, супер!
Предлагаю Вам оформить в виде отдельно статьи.

Кроме того заметил, что у вас в списке ОС нет Windows.
Мой же вариант полностью кросс платформенный.
Господа, перестаньте закапывать сей ресурс подобными статьями
НЛО прилетело и опубликовало эту надпись здесь
Ну как бы если выкинуть корпоративную чушь и такие статьи как эта, то вполне себе ничего, ну будет по 1-2 статьи в день, тоже неплохо.
Так как Вы пишете, что являетесь новичком в C++, то позвольте покритиковать фрагмент Вашего кода:
string message = "M-SEARCH * HTTP/1.1\r\n";
	message += "HOST: 239.255.255.250:1900\r\n";
	message += "ST:" + st + "\r\n";
	message += "MAN: \"ssdp:discover\"\r\n";
	message += "MX:1\r\n\r\n";

Это лучше написать так:
string message = "M-SEARCH * HTTP/1.1\r\n"
	"HOST: 239.255.255.250:1900\r\n"
	"ST:" + st + "\r\n"
	"MAN: \"ssdp:discover\"\r\n"
	"MX:1\r\n\r\n";


Спасибо, подправил.
Раз вы C++ еще только изучаете, то еще несколько советов:

Исключения не следует ловить по значению, т.к. может произойти «срезка» объекта. Лучше ловить по константной ссылке:
catch (const Poco::TimeoutException &) { }


Вот здесь вам не нужна копия IP-адреса для печати:
for (string ip : ips) {
		cout << "IP: " << ip << endl;
	}

Лучше брать ссылку на очередное значение, причем константную ссылку дабы подчеркнуть, что ничего изменяться не будет:
for (const string & ip : ips) {
		cout << "IP: " << ip << endl;
	}

Аналогично, полагаю, имеет смысл сделать и с циклом по responses.

В C++11 и выше функцию MakeSsdpRequest имеет смысл переписать так, чтобы она возвращала вектор, а не получала его по неконстантной ссылке:
vector<string> MakeSsdpRequest(string st = "") {
  vector<string> responses;
  ...
  return responses;

Что позволит использовать ее вот так:
int main()
{
	auto responses = MakeSsdpRequest();

Такой подход гораздо удобнее и в плане защиты от исключений, и в плане простоты использования.

В C++ редко доводиться видеть конструкции вида:
using std::string;
using std::vector;
using std::cin;
using std::cout;
using std::endl;

using Poco::Net::SocketAddress;
using Poco::Net::DatagramSocket;
using Poco::Timespan;
using Poco::RegularExpression;

Обычно довольствуются using namespace, особенно в таких коротких программах примерах:
using namespace std;
using namespace Poco;
using namespace Poco::Net;
Спасибо за конструктивный комментарий.

const и & — подправил.
using namespace xxx не использую, что бы меня тут не заплевали, мол засоряю…

А вот на счет возврата vector как результат функции, ведь в этом случае произойдет копирование вектора.
На счет того, что такой подход удобнее в использовании, конечно согласен.
Подскажите пожалуйста чем он удобнее в защите от исключений?

А вот на счет возврата vector как результат функции, ведь в этом случае произойдет копирование вектора.

Здесь сработает NRVO-оптимизация, когда возвращаемое значение будет создано на стеке в вызывающей функции, а вызываемая функция будет сразу работать с этим значением.
Подскажите пожалуйста чем он удобнее в защите от исключений?

У вас может быть так:
std::vector<string> responses;
try {
  MakeSspdRequest(responses);
} catch(...) { ... }
for(const auto & r : responses) // В каком состоянии сейчас responses?

Если у вас вот такой код:
try {
  auto responses = MakeSspdRequest();
  ...
} catch(...) {...}
То в случае исключения у вас responses просто не останется и не возникнет вопросов о том, что там внутри находится.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации