c/c++常用代码--udp多播

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

#include <winsock.h>



#pragma comment(lib, "ws2_32.lib")



#define close closesocket



#undef IP_ADD_MEMBERSHIP

#define IP_ADD_MEMBERSHIP 12





int main(void)

{    

    WSADATA wsa={0};

    WSAStartup(MAKEWORD(2,2),&wsa);





    SOCKET fd;

    SOCKADDR_IN localif;    



    fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    if (fd == -1) {

        perror("socket");

        return -1;

    }



    localif.sin_family = AF_INET;

    localif.sin_port   = htons(1234);

    localif.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind(fd, (SOCKADDR *)&localif, sizeof(localif)) == -1) {

        perror("bind");

        return -1;    

    }





    int ttl = 1;

    if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl)) == SOCKET_ERROR) {

        printf("setsockopt IP_MULTICAST_TTL %d", WSAGetLastError());        

        return -1;    

    }





    struct ip_mreq mreq;

    memset(&mreq, 0, sizeof(mreq));



    mreq.imr_interface.s_addr = inet_addr("192.168.1.145");

    mreq.imr_multiaddr.s_addr = inet_addr("234.0.0.1"); //234.5.6.7



    if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) == -1) {

        printf("setsockopt IP_ADD_MEMBERSHIP %d", WSAGetLastError());        

        return -1;    

    }





    while (true) {

        char buf[1024] = {0};

        int n = recv(fd, buf, sizeof(buf), 0);

        if (n == -1) {

            perror("recv");

            return -1;

        }

        buf[n] = 0;

        printf("%s", buf);

    }





    if (setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) == -1) {

        printf("setsockopt IP_DROP_MEMBERSHIP %d", WSAGetLastError());

        return -1;    

    }





    WSACleanup();



    return 0;

}

 

你可能感兴趣的:(c/c++)