// //////////////////////////////////////////////////////////////////////////// IpAddressGeneric ParseIpAddressFromString(const char *in_string, bool ipv6_ok, bool mc_ok, bool require_mc) { IpAddressGeneric tmp_datum; try { if ((in_string == NULL) || (!(*in_string))) { in_string = ""; MLB::Utility::ThrowInvalidArgument("The IP address string is empty."); } tmp_datum = IpAddressGeneric::from_string(in_string); if ((!ipv6_ok) && tmp_datum.is_v6()) { if (!tmp_datum.to_v6().is_v4_compatible()) MLB::Utility::ThrowInvalidArgument("The address is an IPv6 " "address which is not convertible to an IPv4 equivalent."); tmp_datum = tmp_datum.to_v6().to_v4(); } if ((!mc_ok) && IsMulticastIP(tmp_datum)) MLB::Utility::ThrowInvalidArgument("The address is a multicast group " "which was not specified as desireable in this context."); if (require_mc) CheckIsMulticastIP(tmp_datum); } catch (const std::exception &except) { MLB::Utility::Rethrow(except, "The " + std::string((require_mc) ? " multicast group " : " ip address ") + "specification string '" + std::string(in_string) + "' is invalid: " + std::string(except.what())); } return(tmp_datum); }
int main(int argc, char **argv) { usage(); if(argc != 3) { return -1; } string ip_str = argv[1]; uint32_t ip; uint16_t port = atoi(argv[2]); int fd; int ec; struct sockaddr_in sockaddr; fd = socket(AF_INET, SOCK_DGRAM, 0); ec = fd; EC_CHECK_RETURN(ec); ip = Str2IP(ip_str); if(IsMulticastIP(ip)) { struct ip_mreq mreq; memset(&mreq, 0, sizeof(mreq)); inet_aton(ip_str.c_str(), &mreq.imr_multiaddr); ec = setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, &mreq,sizeof(mreq)); EC_CHECK_RETURN(ec); } sockaddr.sin_family=AF_INET; sockaddr.sin_addr.s_addr=htonl(ip); sockaddr.sin_port=htons(port); // ec = connect(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)); EC_CHECK_RETURN(ec); char data[1536]; int length, data_length = 1024; while(true) { length = sendto(fd, (void *)data, data_length, 0, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr)); if(length < 0) { if(errno != EAGAIN) { cout << "Failed to send data, errno: " << errno << "," << strerror(errno) << endl; break; } } cout << "send data length " << length << endl; usleep(10 * 1000); } return 0; }