Pull to refresh

Comments 10

UFO landed and left these words here
Мне нужен!
И уверен другим может пригодиться.
Poco идет под свободной лицензией Boost Software License

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

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

Кроме того заметил, что у вас в списке ОС нет Windows.
Мой же вариант полностью кросс платформенный.
Господа, перестаньте закапывать сей ресурс подобными статьями
UFO landed and left these words here
Ну как бы если выкинуть корпоративную чушь и такие статьи как эта, то вполне себе ничего, ну будет по 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 просто не останется и не возникнет вопросов о том, что там внутри находится.
Sign up to leave a comment.

Articles