85 std::string_view udp_url) {
86 std::unique_ptr<UdpOptions> options(
new UdpOptions);
88 const size_t question_mark_pos = udp_url.find(
'?');
89 std::string_view address_str = udp_url.substr(0, question_mark_pos);
91 if (question_mark_pos != std::string_view::npos) {
92 std::string_view options_str = udp_url.substr(question_mark_pos + 1);
93 std::vector<KVPair> kv_pairs = SplitStringIntoKeyValuePairs(options_str);
95 for (
const auto& pair : kv_pairs) {
96 switch (GetFieldType(pair.first)) {
97 case kBufferSizeField:
98 if (!absl::SimpleAtoi(pair.second, &options->buffer_size_)) {
99 LOG(ERROR) <<
"Invalid udp option for buffer_size field "
104 case kInterfaceAddressField:
105 options->interface_address_ = pair.second;
107 case kMulticastSourceField:
108 options->source_address_ = pair.second;
109 options->is_source_specific_multicast_ =
true;
113 if (!absl::SimpleAtoi(pair.second, &reuse_value)) {
114 LOG(ERROR) <<
"Invalid udp option for reuse field " << pair.second;
117 options->reuse_ = reuse_value > 0;
121 if (!absl::SimpleAtoi(pair.second, &options->timeout_us_)) {
122 LOG(ERROR) <<
"Invalid udp option for timeout field "
128 LOG(ERROR) <<
"Unknown field in udp options (\"" << pair.first
135 if (!absl::GetFlag(FLAGS_udp_interface_address).empty()) {
136 LOG(WARNING) <<
"--udp_interface_address is deprecated. Consider switching "
137 "to udp options instead, something like "
138 "udp:://ip:port?interface=interface_ip.";
139 options->interface_address_ = absl::GetFlag(FLAGS_udp_interface_address);
142 if (!StringToAddressAndPort(address_str, &options->address_,
144 LOG(ERROR) <<
"Malformed address:port UDP url " << address_str;