LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1126|回复: 3

fedora下的多播

[复制链接]
发表于 2007-8-27 13:57:18 | 显示全部楼层 |阅读模式
我在fedora下使用socket多播编程,局域网内的windows机器能收到,本机收不到,局域网内的其他机器进行多播,我的fedora也收不到!!!急!!!
fc5、fedora7都不行
多播程序:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <stdlib.h>

int port = 8889;

int main(void)
{
    int socket_descriptor;
    struct sockaddr_in address;

    socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0);
    if (socket_descriptor == -1) {
        perror("Opening socket");
        exit(EXIT_FAILURE);
    }

    /* Initialize the address structure */
    memset(&address, 0, sizeof(address));
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("224.0.0.1");
    address.sin_port = htons(port);

    /* Start broadcasting */
    while(1) {
        if(sendto(socket_descriptor, "test from broadcast",
           sizeof("test from broadcast"), 0,
           (struct sockaddr *)&address, sizeof(address)) < 0) {
            perror("sendto");
            exit(EXIT_FAILURE);
        }
        sleep(2);
    }
   
    exit(EXIT_SUCCESS);
}   


监听程序:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <unistd.h>
#include <memory.h>


int port = 8889;

int main(void)
{
    struct ip_mreq command;
    int loop = 1; /* The broadcast loops back to localhost */
    int iter = 0;
    socklen_t sin_len;
    char message[256];
    int socket_descriptor;
    struct sockaddr_in sin;
//    struct hostent *server_host_name;


    bzero(&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_port = htons(port);

    if((socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    /* Allow multiple processes to use this same port:*/
    loop = 0;
    if(setsockopt(socket_descriptor, SOL_SOCKET, SO_REUSEADDR,
         &loop, sizeof(loop)) < 0) {
        perror("setsockopt:SO_REUSEADDR");
        exit(EXIT_FAILURE);
    }

    if(bind(socket_descriptor, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
        perror("bind");
        exit(EXIT_FAILURE);
    }

    /* Allow broadcast to this machine */
    loop = 1;
    if(setsockopt(socket_descriptor, IPPROTO_IP, IP_MULTICAST_LOOP,
         &loop, sizeof(loop)) < 0) {
        perror("setsockopt:IP_MULTICAST_LOOP");
        exit(EXIT_FAILURE);
    }

    /* Join the broadcast group:*/
    command.imr_multiaddr.s_addr = inet_addr("224.0.0.1");
    command.imr_interface.s_addr = htonl(INADDR_ANY);

    if(command.imr_multiaddr.s_addr == -1) {
        perror("224.0.0.1 not a legal multicast address");
        exit(EXIT_FAILURE);
    }

    if (setsockopt(socket_descriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP,
         &command, sizeof(command)) < 0) {
        perror("setsockopt:IP_ADD_MEMBERSHIP");
    }

    while(iter++ < 10) {
        sin_len = sizeof(sin);
        if(recvfrom(socket_descriptor, message, 256, 0,
           (struct sockaddr *)&sin, &sin_len) == -1) {
            perror("recvfrom");
        }
        printf("Response #%-2d from server: %s\n", iter, message);
        sleep(2);
    }

    /* leave the broadcast group */
    if(setsockopt(socket_descriptor, IPPROTO_IP, IP_DROP_MEMBERSHIP,
       &command, sizeof(command)) < 0) {
        perror("setsockopt:IP_DROP_MEMBERSHIP");
    }

    close(socket_descriptor);

    exit(EXIT_SUCCESS);
}
发表于 2007-8-27 15:53:11 | 显示全部楼层
Fedora的防火墙没开那个端口?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-27 23:45:24 | 显示全部楼层
人才,高手啊!搞定了,万分感谢!!!
回复 支持 反对

使用道具 举报

发表于 2007-8-29 09:15:55 | 显示全部楼层
不敢不敢,只是以前遇到的一些问题都是忘记关Fedora默认打开的防火墙而已。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表