组播互相通信2024-8-21

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

int sock_fd = -1;

void * mem_recv(void *arg)
{
    char * argv = (char *)arg;
    struct sockaddr_in membership;
    membership.sin_family = AF_INET;
    membership.sin_port = htons(atoi(argv));
    membership.sin_addr.s_addr = inet_addr("225.10.10.10");
    socklen_t membership_len = sizeof(membership);
    bind(sock_fd,(struct sockaddr *)&membership,membership_len);
    char buf[100];
    while(1)
    {
        bzero(buf,100);
        fgets(buf,100,stdin);
        sendto(sock_fd,buf,100,0,(struct sockaddr *)&membership,membership_len);
    }
}

int main(int argc, const char *argv[])
{
    //创建套接字
    sock_fd = socket(AF_INET,SOCK_DGRAM,0);
    if(sock_fd<0)
    {
        perror("creat socket failed");
        return -1;
    }


    //加入组播
    struct ip_mreq membership;
    membership.imr_multiaddr.s_addr = inet_addr("225.10.10.10");
    membership.imr_interface.s_addr = INADDR_ANY;

    socklen_t membership_len = sizeof(membership);

    if(setsockopt(sock_fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&membership,membership_len)<0)
    {
        perror("creat membership failed");
        return -1;
    }


    //线程(向组播发消息)
    pthread_t tid;
    pthread_create(&tid,NULL,mem_recv,(void *)&argv[1]);


    //给本机地址赋值
    struct sockaddr_in local,cilent;
    local.sin_family = AF_INET;
    local.sin_port = htons(atoi(argv[1]));
    local.sin_addr.s_addr = INADDR_ANY;
    socklen_t local_len = sizeof(local);
    //绑定本地地址到套接字
    if(bind(sock_fd,(struct sockaddr *)&local,local_len)<0)
    {
        if(errno != 98)
        {
            perror("bind failed");
            return -1;
        }
    }

    //接受组播的消息
    socklen_t cilent_len =sizeof(cilent);
    char buf[100];
    while(1)
    {
        bzero(buf,100);
        recvfrom(sock_fd,buf,100,0,(struct sockaddr *)&cilent,&cilent_len);
        printf("[%s:%d]%s\n",inet_ntoa(cilent.sin_addr),ntohs(cilent.sin_port),buf);
        if(strcmp(buf,"bye\n") == 0)
        {
            printf("[%s:%d]已退出\n",inet_ntoa(cilent.sin_addr),ntohs(cilent.sin_port));
            break;
        }
    }
    return 0;
}                                                                                                                                                                  
                                                                                                                                                                   
                                                                                                                                                                   
                                                                                                                                                                   
                                                                                                                                                                   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值