c中的组播环回

时间:2016-04-25 04:17:35

标签: c linux multicast

我正在尝试测试客户端加入组的多播环回 并且服务器将组播messgaes到这个组中受限制的客户端 在127.0.0.1只有!!!!!

参考:http://www.tenouk.com/Module41c.html,来源是:

服务器:

struct in_addr localInterface;
struct sockaddr_in groupSock;
int sd;
char databuf[1024] = "Multicast test message lol!";
int datalen = sizeof(databuf);

int main (int argc, char *argv[ ])
{
    /* Create a datagram socket on which to send. */
    sd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sd < 0)
    {
        perror("Opening datagram socket error");
        exit(1);
    }
    else
        printf("Opening the datagram socket...OK.\n");

    /* Initialize the group sockaddr structure with a */
    /* group address of 225.1.1.1 and port 5555. */
    memset((char *) &groupSock, 0, sizeof(groupSock));
    groupSock.sin_family = AF_INET;
    groupSock.sin_addr.s_addr = inet_addr("224.0.0.0");
    groupSock.sin_port = htons(4321);

    /* Disable loopback so you do not receive your own datagrams.
     * {
     * char loopch = 0;
     * if(setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loopch, sizeof(loopch)) < 0)
     * {
     * perror("Setting IP_MULTICAST_LOOP error");
     * close(sd);
     * exit(1);
     * }
     * else
     * printf("Disabling the loopback...OK.\n");
     * }
     * */

    /* Set local interface for outbound multicast datagrams. */
    /* The IP address specified must be associated with a local, */
    /* multicast capable interface. */
    localInterface.s_addr = inet_addr("127.0.0.1");
    if(setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localInterface, sizeof(localInterface)) < 0)
    {
        perror("Setting local interface error");
        exit(1);
    }
    else
        printf("Setting the local interface...OK\n");

    /* Send a message to the multicast group specified by the*/
    /* groupSock sockaddr structure. */
    /*int datalen = 1024;*/
    while( 1 ){
        usleep( 1000 ) ;
        if(sendto(sd, databuf, datalen, 0, (struct sockaddr*)&groupSock, sizeof(groupSock)) < 0)
        {
            perror("Sending datagram message error");
        }
        else
            printf("Sending datagram message...OK\n");
    } 
    /* Try the re-read from the socket if the loopback is not disable
     * if(read(sd, databuf, datalen) < 0)
     * {
     * perror("Reading datagram message error\n");
     * close(sd);
     * exit(1);
     * }
     * else
     * {
     * printf("Reading datagram message from client...OK\n");
     * printf("The message is: %s\n", databuf);
     * }
     * */
    return 0;
}

和客户来源:

struct sockaddr_in localSock;
struct ip_mreq group;
int sd;
int datalen;
char databuf[1024];

int main(int argc, char *argv[])
{
    /* Create a datagram socket on which to receive. */
    sd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sd < 0)
    {
        perror("Opening datagram socket error");
        exit(1);
    }
    else
        printf("Opening datagram socket....OK.\n");

    /* Enable SO_REUSEADDR to allow multiple instances of this */
    /* application to receive copies of the multicast datagrams. */
    {
        int reuse = 1;
        if(setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0)
        {
            perror("Setting SO_REUSEADDR error");
            close(sd);
            exit(1);
        }
        else
            printf("Setting SO_REUSEADDR...OK.\n");
    }

    /* Bind to the proper port number with the IP address */
    /* specified as INADDR_ANY. */
    memset((char *) &localSock, 0, sizeof(localSock));
    localSock.sin_family = AF_INET;
    localSock.sin_port = htons(4321);
    localSock.sin_addr.s_addr = INADDR_ANY;
    if(bind(sd, (struct sockaddr*)&localSock, sizeof(localSock)))
    {
        perror("Binding datagram socket error");
        close(sd);
        exit(1);
    }
    else
        printf("Binding datagram socket...OK.\n");

    /* Join the multicast group 226.1.1.1 on the local 203.106.93.94 */
    /* interface. Note that this IP_ADD_MEMBERSHIP option must be */
    /* called for each local interface over which the multicast */
    /* datagrams are to be received. */
    group.imr_multiaddr.s_addr = inet_addr("224.0.0.0");
    group.imr_interface.s_addr = inet_addr("127.0.0.1");
    if(setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0)
    {
        perror("Adding multicast group error");
        close(sd);
        exit(1);
    }
    else
        printf("Adding multicast group...OK.\n");

    /* Read from the socket. */
    datalen = sizeof(databuf);
    while( 1 ){
        if(read(sd, databuf, datalen) <= 0)
        {
            perror("Reading datagram message error");
            close(sd);
            exit(1);
        }
        else
        {
            printf("Reading datagram message...OK.\n");
            printf("The message from multicast server is: \"%s\"\n", databuf);
        }
    } //while 
    return 0;
}

以root身份添加以下内容后,它可以正常工作:

route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
ifconfig lo multicast

如果我有一个client.exe在运行,那么一切都很完美,但是, 如果我运行2个client.exe副本,那么server.exe或client.exe很容易挂起, 如果我需要多个应用程序加入该组(在此示例224.0.0.0中) ,我应该如何修改源代码,以便许多客户端可以加入muticast gruop 并且没有麻烦地接收数据包?!

0 个答案:

没有答案