首页 > 其他分享 >UDP练习题——实现将自己加入到多播组中并等待服务器发送数据包

UDP练习题——实现将自己加入到多播组中并等待服务器发送数据包

时间:2024-06-04 18:33:24浏览次数:13  
标签:练习题 多播 addr errno mreqn 服务器发送 include 数据包 socket

设计程序,要求程序可以加入到一个多播组中并等待服务器发送,数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端, 消息内容格,式「消息来源IP 消息时间 1:消息内容 多播地址和端口号

/*************************************************************************************************************************
 *
 *	file name:	udp_cs.c
 *	author	 :  Dazz
 *	date	 :  2024/6/4
 *	function :  设计程序,要求程序可以加入到一个多播组中并等待服务器发送
 *              数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端, 消息内容格
 *              式「消息来源IP 消息时间 1:消息内容 多播地址和端口号
 *
 *
 *	CopyRight (c)  2024   [email protected]   All Right Reseverd
 *
 * **************************************************************************************************************************/
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */

int main(int argc, char *argv[])
{
    // 检查参数有效性
    if (argc != 2)
    {
        fprintf(stderr, "argument is invaild ,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }

    // 1.创建UDP套接字
    int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
    if (udp_socket == -1)
    {
        fprintf(stderr, "udp socket error,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }

    // 把主机IP加入到多播组中
    struct ip_mreqn mreqn;
    mreqn.imr_multiaddr.s_addr = inet_addr("224.6.6.6");
    mreqn.imr_address.s_addr = inet_addr("192.168.64.233");
    mreqn.imr_ifindex = 0;
    socklen_t option_len = sizeof(struct ip_mreqn);

    int revl = setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&mreqn, option_len);
    if (-1 == revl)
    {
        fprintf(stderr, "setsockopt error,errno:%d,%s\n", errno, strerror(errno));
        exit(2);
    }

    // 3.需要先绑定服务器的端口和地址
    struct sockaddr_in host_addr;

    host_addr.sin_family = AF_INET;                // 协议族,是固定的
    host_addr.sin_port = htons(atoi(argv[1]));     // 目标端口,必须转换为网络字节序
                                                   // host_addr.sin_addr.s_addr = inet_addr(argv[2]); // 目标地址 "192.168.64.xxx"  已经转换为网络字节序  INADDR_ANY
    host_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 目标地址 "192.168.64.xxx"  已经转换为网络字节序  INADDR_ANY

    bind(udp_socket, (struct sockaddr *)&host_addr, sizeof(host_addr));

    // 4.调用recvfrom等待接收数据,并且接收客户端的网络信息
    char buf[128] = {0};
    struct sockaddr_in client;
    socklen_t client_len = sizeof(client);

    while (1)
    {
        recvfrom(udp_socket, buf, sizeof(buf), 0, (struct sockaddr *)&client, &client_len); // 默认会阻塞
        printf("client ip is [%s],time is [%s]\n", inet_ntoa(client.sin_addr), buf);
        bzero(buf, sizeof(buf));
    }

    return 0;
}

标签:练习题,多播,addr,errno,mreqn,服务器发送,include,数据包,socket
From: https://www.cnblogs.com/Dazz24/p/18231474

相关文章