#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>struct sockaddr_in localSock;
struct ip_mreq group;
int sd;
int datalen;
char databuf[1500];
int i;int main(int argc, char *argv[])
{
sd = socket(AF_INET, SOCK_DGRAM, 0);
if(sd < 0){
perror("Opening datagram socket error");
exit(1);
} else
printf("Opening datagram socket....OK.\n");{
int reuse = 1;
//设置套接字选项为SO_REUSEADDR,socket可重用,经常在socket通信时进行设置。
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");
}memset((char *) &localSock, 0, sizeof(localSock));
localSock.sin_family = AF_INET;
localSock.sin_port = htons(45969);
localSock.sin_addr.s_addr = inet_addr("127.0.0.1");//INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。//bind()将一本地地址与一套接口捆绑。
if(bind(sd, (struct sockaddr*)&localSock, sizeof(localSock))){
perror("Binding datagram socket error");
close(sd);
exit(1);
} else
printf("Binding datagram socket...OK.\n");group.imr_multiaddr.s_addr = inet_addr("224.0.0.1"); // 组播组的IP地址。
group.imr_interface.s_addr = inet_addr("127.0.0.1");// 本地某一网络设备接口的IP地址。//IP_ADD_MEMBERSHIP 在指定接口上加入组播组
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");datalen = sizeof(databuf);/*if(i=recvfrom(sd,databuf,10,0,(struct sockaddr*)& localSock,(socklen_t*)&datalen)<0){*/
if(i=read(sd, databuf, datalen) < 0){
perror("Reading datagram message error");
close(sd);
exit(1);
} else {
printf("iiii %d bytes data.\n", i);
printf("Reading datagram message...OK.\n");
printf("The message from multicast server is: %s\n", databuf);
}return 0;
} 发送组播数据:
通过本机指定端口号发送数据到组播224.0.0.1.

解决方案 »

  1.   

    没有仔细看代码,但先普及一下:
    DGRAM是UDP
    UDP是无连接协议
    无连接协议没有要求必须ack(打个比方,事实上这个报文在udp里不存在),你发你的,我没必要告诉你我收没收着。
    就是:
    如果你是暗恋者,你必须付出不止一辈子(甚至你的祖上和后辈),但她永远不知道也从不在乎你的存在,流媒体就是这样的,这是一个美德,一个人类很重要的美德。
      

  2.   


    localSock.sin_addr.s_addr = inet_addr("127.0.0.1");
    改为:
    localSock.sin_addr.s_addr = INADDR_ANY;
      

  3.   


    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    struct in_addr localInterface;
    struct sockaddr_in groupSock;
    int sd;
    char databuf[1024] = "Multicast test message lol!";
    int datalen = sizeof(databuf);
    int i;int main (int argc, char *argv[ ])
    {
    /* 创建要发送的数据报套接字. */
    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");/*初始化224.0.0.1和端口组地址的组结构体。* /
    memset((char *) &groupSock, 0, sizeof(groupSock));
    groupSock.sin_family = AF_INET;
    groupSock.sin_addr.s_addr = inet_addr("224.0.0.1");
    groupSock.sin_port = htons(45969);      //4321
    /* 禁用回送你不接受你自己的数据报.
    {
    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");
    }
    */
    /*出境多播数据报设置本地接口. */
    /* 指定的IP地址必须与本地关联 */
    /* 组播接口. */
    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");
    /* 发送消息的groupsock sockaddr结构指定的多播组。
     */
    /*int datalen = 1024;*/
    if(sendto(sd, databuf, datalen, 0, (struct sockaddr*)&groupSock, sizeof(groupSock)) < 0)
    {perror("Sending datagram message error");}
    else
    printf("Sending datagram message...OK\n");
    /
    return 0;
    }
      

  4.   

    发送端没有必要设置什么,只要网224.0.0.1发送udp报文就已经是组播了。你把那两句setsockopt去掉