如何将udp套接字绑定到单个单播地址

时间:2017-11-08 20:58:27

标签: c sockets network-programming

我没有任何c编程方面的经验,而且我有点困难,我必须创建一个udp套接字并将其与单播IP地址和短暂端口绑定。我只知道如何创建一个udp套接字,我不知道如何继续。任何帮助,链接将不胜感激。谢谢!

我搜索了互联网,发现我们可以使用get_ifi_info函数获取接口列表,但是我们如何找出哪个是单播ip?

1 个答案:

答案 0 :(得分:2)

您可以使用bind()函数执行此操作:

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

第一个参数是套接字的文件描述符。第二个是指向套接字地址结构的指针,该结构包含(用于IPv4或IPv6)要绑定的IP地址和端口。第三个是第二个参数指向的结构的大小。

例如:

int s = socket(AF_INET, SOCK_DGRAM, 0); // AF_INET is for IPv4
if (s == -1) {
    perror("socket failed");
    exit(1);
}

struct sockaddr_in sin;  // socket address structure specific to IPv4
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("192.168.1.2");    // binds to the local address 192.168.1.2
sin.sin_port = 0;    // 0 means the OS picks the port

if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
    perror("bind failed");
    exit(1);
}
printf("bind succeeded\n");

如果您需要了解实际选择的端口,则可以使用getsockname()功能:

struct sockaddr_in sin;  // socket address structure specific to IPv4
socklen_t sinlen = sizeof(sin);
memset(&sin, 0, sizeof(sin));

if (getsockname(s, (struct sockaddr *)&sin, &sinlen) == -1) {
    perror("getsockname failed");
    exit(1);
}
printf("bound to port %hu\n", ntohs(sin.sin_port));