كيفية تحويل URL إلى عنوان IP باستخدام Boost::asio؟
-
14-11-2019 - |
سؤال
لذلك أنا بحاجة إلى طريقة ما للتحويل Protocol://URLorIP:Port
سلسلة في سلسلة ip
كثافة العمليات port
كيف تفعل مثل هذا الشيء باستخدام Boost ASIO وBoost Regex؟أم أنه من الممكن - للحصول على IP باستخدام C++ نت ليب (مرشح التعزيز) - ملاحظة - لا نحتاج إلى اتصال طويل - IP فقط.
لذلك أستخدم حاليًا هذا الرمز للتحليل
#include <boost/regex.hpp>
#include <vector>
#include <string>
int main(int argc, char** argv)
{
if (argc < 2) return 0;
std::vector<std::string> values;
boost::regex expression(
// proto host port
"^(\?:([^:/\?#]+)://)\?(\\w+[^/\?#:]*)(\?::(\\d+))\?"
// path file parameters
"(/\?(\?:[^\?#/]*/)*)\?([^\?#]*)\?(\\\?(.*))\?"
);
std::string src(argv[1]);
if (boost::regex_split(std::back_inserter(values), src, expression))
{
const char* names[] = {"Protocol", "Host", "Port", "Path", "File",
"Parameters", NULL};
for (int i = 0; names[i]; i++)
printf("%s: %s\n", names[i], values[i].c_str());
}
return 0;
}
ما الذي يجب علي إضافته إلى برنامجي الصغير لتحليل عنوان URL إلى IP؟
المحلول
تذكر أنه قد يكون هناك عدة عناوين IP لأي اسم مضيف واحد، ويمنحك Boost مُكرِّرًا سيمر عبرها.
الاستخدام واضح إلى حد ما، أضف هذا من قبل return 0;
من برنامجك:
std::cout << "IP addresses: \n";
boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(values[1], "");
for(boost::asio::ip::tcp::resolver::iterator i = resolver.resolve(query);
i != boost::asio::ip::tcp::resolver::iterator();
++i)
{
boost::asio::ip::tcp::endpoint end = *i;
std::cout << end.address() << ' ';
}
std::cout << '\n';
ولا تنسى #include <boost/asio.hpp>
اختبار المدى:
~ $ g++ -g -Wall -Wextra -pedantic -Wconversion -ansi -o test test.cc -lboost_regex -lboost_system -lboost_thread
~ $ ./test http://www.google.com:7777
Protocol: http
Host: www.google.com
Port: 7777
Path:
File:
Parameters:
IP addresses:
74.125.226.179 74.125.226.176 74.125.226.178 74.125.226.177 74.125.226.180
ملاحظة:للإشارة، اتصلت
- محلل TCP البناء
- الاستعلام منشئ المضيف/الخدمة مع قيمة خدمة لا تهتم
""
- رمي الاستثناء شكل الحل ()
- تم إلغاء الإشارة إلى المكرر للحصول على إدخال محلل
- تم استخدام Resolver_entry's اكتب التحويل إلى نقطة النهاية
- استخدم نقطة نهاية TCP عنوان () الوصول
- مستخدم عامل << لإظهار العنوان:يمكنك استخدام إلى سلسلة() بدلا من ذلك، إذا لزم الأمر.
لا تنتمي إلى StackOverflow