windows组播例子

接收端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

void sockerr(const char* message)
{
    wchar_t* s = NULL;
    FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, WSAGetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&s, 0, NULL);
    fprintf(stderr, "%s: (%d) %S\n", message, WSAGetLastError(), s);


}

int main(int argc, char* argv[])
{
    int addr_len;
    struct sockaddr_in sin, sin_recv, * sreq;
    struct ip_mreq multi;
    struct group_req req;
    char mes[1500], name[100];
    int c, option, len;
    struct addrinfo* m_ai, * i_ai;
    struct WSAData data;
    SOCKET sock;


    if (WSAStartup(2, &data)) {
        sockerr("Error in WSAStartup");
        exit(1);
    }

    memset(&multi, 0, sizeof(multi));
    inet_pton(AF_INET, "224.0.22.1", &multi.imr_multiaddr);
    //multi.imr_interface = 11;
    char hostname[128];
    struct hostent* pHost;

    if (gethostname(hostname, 128) == 0)
    {
        printf("%s\n", hostname);//计算机名字 
    }
    pHost = gethostbyname(hostname);
    struct ip_mreq imr;
    int sm;
    memset(&imr, 0, sizeof(struct ip_mreq));
    imr.imr_multiaddr.S_un.S_addr = inet_addr("224.0.22.1");
    imr.imr_interface.S_un.S_addr = inet_addr(inet_ntoa(*(struct in_addr*)pHost->h_addr_list[1]));
    
    memset(&req, 0, sizeof(req));
    sreq = (struct sockaddr_in*)&req.gr_group;
    sreq->sin_family = AF_INET;
    inet_pton(AF_INET, "224.0.22.1", &sreq->sin_addr);
    req.gr_interface = 0;

    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    //inet_pton(AF_INET, "::", &sin.sin_addr);
    sin.sin_addr.s_addr = inet_addr("192.168.0.15");
	sin.sin_port = htons(9210);

    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        sockerr("Error creating socket");
        exit(1);
    }

    if (bind(sock, (struct sockaddr*)&sin, sizeof(sin)) == -1) {
        sockerr("Error binding socket");
        closesocket(sock);
        exit(1);
    }
    //if (setsockopt(sock,IPPROTO_IPV6,IPV6_JOIN_GROUP,(char *)&multi,sizeof(multi))== -1) {
    if (setsockopt(sock, IPPROTO_IP, MCAST_JOIN_GROUP, (char*)&req, sizeof(req)) == -1) {
        sockerr("Error joining multicast group");
        closesocket(sock);

        exit(1);
    }

    while (1) {
        memset(mes, 0, sizeof(mes));
        memset(&sin_recv, 0, sizeof(sin_recv));
        addr_len = sizeof(sin_recv);
        printf("%d: Waiting for packet...\n", getpid());
        if ((len = recvfrom(sock, mes, sizeof(mes), 0, (struct sockaddr*)&sin_recv, &addr_len)) == -1) {
            sockerr("error recving socket");
            closesocket(sock);
            exit(1);
        }
        if (inet_ntop(AF_INET6, &sin_recv.sin_addr, name, sizeof(name)) == NULL) {
            sockerr("inet_ntop failed");
            continue;
        }
        printf("%d: Got packet\n", getpid());
        printf("%d: Origin: %s port %d\n", getpid(), name, sin_recv.sin_port);
        printf("%d: Len: %d, Message: %s\n", getpid(), len, mes);
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值