// ////////////////////////////////////////////////////////////////////////////
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);
}
Exemple #2
0
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;
}