精华内容
参与话题
问答
  • udp广播跟组播实现差不多,但是广播只能在局域网下,而多播(组播)也可以在广域网下使用。这次分享的是组播的服务器代码。 主要流程:创建套接字-》绑定服务器端口-》开放服务器广播权限-》创建广播地址段的客户端-...

    udp广播跟组播实现差不多,但是广播只能在局域网下,而多播(组播)也可以在广域网下使用。这次分享的是组播的服务器代码。

    主要流程:创建套接字-》绑定服务器端口-》开放服务器广播权限-》创建广播地址段的客户端-》开始在这个网段广播

    客户端只要加入这个对应端口和网段就可以收到组播的内容了

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include<net/if.h>
    int main()
    {
    	struct sockaddr_in ser_addr;
    	socklen_t ser_len = sizeof(ser_addr);
    	memset(&ser_addr, 0, sizeof(ser_addr));
    	ser_addr.sin_family = AF_INET;
    	ser_addr.sin_port = htons(8080);
    	ser_addr.sin_port = htonl(INADDR_ANY);
    
    	int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    	if (sockfd == -1)
    	{
    		perror("sock error");
    		exit(1);
    	}
    
    
    	int ret = bind(sockfd, (struct sockaddr*)&ser_addr, ser_len);
    	if (ret == -1)
    	{
    		perror("bind error");
    		exit(1);
    	}
    
    	struct sockaddr_in cli_addr;
    	memset(&cli_addr, 0, sizeof(cli_addr));
    	cli_addr.sin_family = AF_INET;
    	cli_addr.sin_port = htons(6767);
    	//大端字节序转化成网络字节序
    	inet_pton(AF_INET, "239.0.0.10", &cli_addr.sin_addr.s_addr);
    
    	//开放端口组播权限
    	struct ip_mreqn muti;
    	inet_pton(AF_INET, "239.0.0.10", &muti.imr_multiaddr.s_addr);
    	inet_pton(AF_INET, "0.0.0.0", &muti.imr_address.s_addr);
    	muti.imr_ifindex = if_nametoindex("eht0");//获取网卡 序列,这里我的网卡叫eht0
    	setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_IF, &muti, sizeof(muti));
    
    	int num = 0;
    	while (1)
    	{
    		char buf[1024] = { 0 };
    		sprintf(buf, "hello udp:%d", num++);//每隔一秒广播一次
    		int ret = sendto(sockfd, &buf, strlen(buf) + 1, 0, (struct sockaddr*)&cli_addr, sizeof(cli_addr));
    		if (ret == -1)
    		{
    			perror("send error");
    			exit(1);
    		}
    		printf("sendbuf:%s\n", buf);
    
    		sleep(1);
    	}
    	close(sockfd);
    	return 0;
    }
    
    展开全文
  • #include <WINSOCK.H> #include <stdio.h> #define HELLO_PORT 7905 #define HELLO_GROUP "228.4.5.6" #pragma comment(lib, "WSOCK32.lib") #define MSGBUFSIZE 156 int main(int argc, c...

     

    #include <WINSOCK.H>
    #include <stdio.h>
    #define HELLO_PORT  7905    
    #define HELLO_GROUP "228.4.5.6"    
    #pragma comment(lib, "WSOCK32.lib")
    #define MSGBUFSIZE 156
    int main(int argc, char *argv[])    
    { 
     int server =0;
     if(!strncmp(argv[1],"-s",2))
    {
      server =1;
    }
    if(!server)
    {
     WSADATA     wsaData;
      // Initialize Windows socket library
        WSAStartup(MAKEWORD(2,2), &wsaData);
        struct sockaddr_in addr;    
        int fd, cnt;    
        char *message="Hello, World!";    
        /* create what looks like an ordinary UDP socket */    
        if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     
        {    
            perror("socket");    
            exit(1);    
        }    
        /* set up destination address */    
        memset(&addr,0,sizeof(addr));    
        addr.sin_family=AF_INET;    
        addr.sin_addr.s_addr=inet_addr(HELLO_GROUP);    
        addr.sin_port=htons(HELLO_PORT);    
        /* now just sendto() our destination! */    
        while (1)    
        {    
            if (sendto(fd,message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)     
            {    
                perror("sendto");    
                exit(1);    
            }    
        printf("Send %s\n",message);
            Sleep(1000);    
        }    
        return 0;    
    }
    else
    {
    WSADATA     wsaData;
      // Initialize Windows socket library
      WSAStartup(MAKEWORD(2,2), &wsaData);
        struct sockaddr_in addr;    
        int fd, nbytes,addrlen;    
        struct ip_mreq mreq;    
        char msgbuf[MSGBUFSIZE];    
        u_int yes=1; /*** MODIFICATION TO ORIGINAL */    
        /* create what looks like an ordinary UDP socket */    
        if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     
        {    
            perror("socket");    
            exit(1);    
        }    
        /**** MODIFICATION TO ORIGINAL */    
        /* allow multiple sockets to use the same PORT number */    
        if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(yes)) < 0)     
        {    
            perror("Reusing ADDR failed");    
            exit(1);    
        }    
        /*** END OF MODIFICATION TO ORIGINAL */    
        /* set up destination address */    
        memset(&addr,0,sizeof(addr));    
        addr.sin_family=AF_INET;    
        addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */    
        addr.sin_port=htons(HELLO_PORT);    
        /* bind to receive address */    
        if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)    
        {    
            perror("bind");    
            exit(1);    
        }    
        /* use setsockopt() to request that the kernel join a multicast group */    
        mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);    
        mreq.imr_interface.s_addr=htonl(INADDR_ANY);    
        if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&mreq,sizeof(mreq)) < 0)     
        {    
        int err=GetLastError();
            printf("setsockopt:%d",err);    
            exit(1);    
        }    
        /* now just enter a read-print loop */    
        while (1)     
        {    
            //ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);    
            addrlen=sizeof(addr);  
        printf("Receiving..."); 
            //if((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0,NULL,NULL))<0)
        if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr, (int *)&addrlen)) < 0)     
            {    
                perror("recvfrom");    
                exit(1);    
            } msgbuf[nbytes]  ='\0'; 
            printf("%s",msgbuf);    
        }    
        return 0;    
    }    
    }    
    将其中server段程序中的加入组播组部分程序注释掉,并将组播地址修改为单播地址,那么这程序就变成了UDP单播。即

    /* use setsockopt() to request that the kernel join a multicast group */    
        mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);    
        mreq.imr_interface.s_addr=htonl(INADDR_ANY);    
        if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&mreq,sizeof(mreq)) < 0)     
        {    
        int err=GetLastError();
            printf("setsockopt:%d",err);    
            exit(1);    
        }    

    部分的程序。

    展开全文
  • UDP组播的实现

    2018-09-19 14:54:02
    UDP组播代码实现,内含cilent.c和server.c,服务器和客户端的简单实现代码
  • 组播在双网卡或者多网卡下,系统会根据路由表自动选择网卡发送命令,但是会导致一些网卡发送数据异常,这时候就需要绑定ip来解决这个问题了。 组播报文在网络传播的时候是需要设置TTL的(除非网口都是2层交换机),...
  • Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称...
  • Linux网络编程 之 UDP 组播

    千次阅读 2013-11-22 17:59:01
    最近一直在做linux的网络,现在作个总结...直接上代码吧,一个很简单udp 组播通信的例子,分别为服务器端和客户端的代码。 1、服务器端代码 (multi_udp_server.c) #include #include #include #include #inc

    最近一直在做linux的网络,现在作个总结,陆续贴出来。

    在网上搜了很多资料 ,其中周立发的博客对我的学习参考作用最大,谢谢前辈。

    直接上代码吧,一个很简单udp 组播通信的例子,分别为服务器端和客户端的代码。


    1、服务器端代码 (multi_udp_server.c)

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <netdb.h>
    #include <errno.h>
    
    #define BUFLEN 255
    /*********************************************************************
    *filename: mcastserver.c
    *purpose: 演示组播编程的基本步骤,组播服务器端,关键在于加入组
    *tidied by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
    Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
    *date time:2007-01-25 13:20:00
    *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
    * 但请遵循GPL
    *Thanks to: Google.com
    *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
    * 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
    *********************************************************************/
    int main(int argc, char **argv)
    {
    struct sockaddr_in peeraddr;
    struct in_addr ia;
    int sockfd;
    char recmsg[BUFLEN + 1];
    unsigned int socklen, n;
    struct hostent *group;
    struct ip_mreq mreq;
    
    /* 创建 socket 用于UDP通讯 */
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
    printf("socket creating err in udptalk\n");
    exit(1);
    }
    
    /* 设置要加入组播的地址 */
    bzero(&mreq, sizeof(struct ip_mreq));
    if (argv[1]) {
    	if ((group = gethostbyname(argv[1])) == (struct hostent *) 0) {
    		perror("gethostbyname");
    		exit(errno);
    	}
    } else {
    	printf
    		("you should give me a group address, 224.0.0.0-239.255.255.255\n");
    	exit(errno);
    }
    
    bcopy((void *) group->h_addr, (void *) &ia, group->h_length);
    /* 设置组地址 */
    bcopy(&ia, &mreq.imr_multiaddr.s_addr, sizeof(struct in_addr));
    
    /* 设置发送组播消息的源主机的地址信息 */
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);
    
    /* 把本机加入组播地址,即本机网卡作为组播成员,只有加入组才能收到组播消息 */
    if (setsockopt
    		(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
    		 sizeof(struct ip_mreq)) == -1) {
    	perror("setsockopt");
    	exit(-1);
    }
    
    socklen = sizeof(struct sockaddr_in);
    memset(&peeraddr, 0, socklen);
    peeraddr.sin_family = AF_INET;
    if (argv[2])
    	peeraddr.sin_port = htons(atoi(argv[2]));
    	else
    	peeraddr.sin_port = htons(7838);
    	if (argv[1]) {
    		if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0) {
    			printf("Wrong dest IP address!\n");
    			exit(0);
    		}
    	} else {
    		printf("no group address given, 224.0.0.0-239.255.255.255\n");
    		exit(errno);
    	}
    
    /* 绑定自己的端口和IP信息到socket上 */
    if (bind
    		(sockfd, (struct sockaddr *) &peeraddr,
    		 sizeof(struct sockaddr_in)) == -1) {
    	printf("Bind error\n");
    	exit(0);
    }
    
    /* 循环接收网络上来的组播消息 */
    for (;;) {
    	bzero(recmsg, BUFLEN + 1);
    	n = recvfrom(sockfd, recmsg, BUFLEN, 0,
    			(struct sockaddr *) &peeraddr, &socklen);
    	if (n < 0) {
    		printf("recvfrom err in udptalk!\n");
    		exit(4);
    	} else {
    		/* 成功接收到数据报 */
    		recmsg[n] = 0;
    		printf("peer:%s", recmsg);
    	}
    }
    }

    文件编译:gcc -Wall multi_udp_server.c -o server 

    运行:./server 230.1.1.1 7838


    2、客户端代码(multi_udp_clinet.c)

    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define BUFLEN 255
    /*********************************************************************
     *filename: mcastclient.c
     *purpose: 演示组播编程的基本步骤,其实这就是一个基本的UDP客户端程序
     *tidied by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
     Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
     *date time:2007-01-25 13:10:00
     *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
     * 但请遵循GPL
     *Thanks to: Google.com
     *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
     * 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
     *********************************************************************/
    int main(int argc, char **argv)
    {
    	struct sockaddr_in peeraddr, myaddr;
    
    	int sockfd;
    	char recmsg[BUFLEN + 1];
    	unsigned int socklen;
    
    	/* 创建 socket 用于UDP通讯 */
    	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    	if (sockfd < 0) {
    		printf("socket creating error\n");
    		exit(1);
    	}
    	socklen = sizeof(struct sockaddr_in);
    
    	/* 设置对方的端口和IP信息 */
    	memset(&peeraddr, 0, socklen);
    	peeraddr.sin_family = AF_INET;
    	if (argv[2])
    		peeraddr.sin_port = htons(atoi(argv[2]));
    	else
    		peeraddr.sin_port = htons(7838);
    	if (argv[1]) {
    		/* 注意这里设置的对方地址是指组播地址,而不是对方的实际IP地址 */
    		if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0) {
    			printf("wrong group address!\n");
    			exit(0);
    		}
    	} else {
    		printf("no group address!\n");
    		exit(0);
    	}
    
    	/* 设置自己的端口和IP信息 */
    	memset(&myaddr, 0, socklen);
    	myaddr.sin_family = AF_INET;
    	if (argv[4])
    		myaddr.sin_port = htons(atoi(argv[4]));
    	else
    		myaddr.sin_port = htons(23456);
    
    	if (argv[3]) {
    		if (inet_pton(AF_INET, argv[3], &myaddr.sin_addr) <= 0) {
    			printf("self ip address error!\n");
    			exit(0);
    		}
    	} else
    		myaddr.sin_addr.s_addr = INADDR_ANY;
    
    	/* 绑定自己的端口和IP信息到socket上 */
    	if (bind
    			(sockfd, (struct sockaddr *) &myaddr,
    			 sizeof(struct sockaddr_in)) == -1) {
    		printf("Bind error\n");
    		exit(0);
    	}
    
    	/* 循环接受用户输入的消息发送组播消息 */
    	for (;;) {
    		/* 接受用户输入 */
    		bzero(recmsg, BUFLEN + 1);
    		if (fgets(recmsg, BUFLEN, stdin) == (char *) EOF)
    			exit(0);
    		/* 发送消息 */
    		if (sendto
    				(sockfd, recmsg, strlen(recmsg), 0,
    				 (struct sockaddr *) &peeraddr,
    				 sizeof(struct sockaddr_in)) < 0) {
    			printf("sendto error!\n");
    			exit(3);
    		}
    		printf("'%s' send ok\n", recmsg);
    	}
    }
    
    编译:gcc -Wall multi_udp_clinet.c -o clinet

    运行:./clinet 230.1.1.1 7838 192.168.1.121 5500


    运行结果图如下:



    只要在客户端,敲入要发的字符,就可以服务器端看到了。


    linux网络编程源代码下载:http://download.csdn.net/detail/yanyuanfen2011/6595113


    如有问题欢迎留言交流!


    展开全文
  • Linux网络编程 之 UDP 组播实例

    千次阅读 2015-07-09 11:21:18
    一个很简单udp 组播通信的例子,分别为服务器端和客户端的代码。 1、服务器端代码 (multi_udp_server.c) [objc] view plaincopy #include  #include  #include  #include  #include  #...
    一个很简单udp 组播通信的例子,分别为服务器端和客户端的代码。
    


    1、服务器端代码 (multi_udp_server.c)

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
    1. #include <sys/types.h>  
    2. #include <sys/socket.h>  
    3. #include <arpa/inet.h>  
    4. #include <stdio.h>  
    5. #include <stdlib.h>  
    6. #include <string.h>  
    7. #include <netdb.h>  
    8. #include <errno.h>  
    9.   
    10. #define BUFLEN 255  
    11. /********************************************************************* 
    12. *filename: mcastserver.c 
    13. *purpose: 演示组播编程的基本步骤,组播服务器端,关键在于加入组 
    14. *tidied by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com) 
    15. Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言 
    16. *date time:2007-01-25 13:20:00 
    17. *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途 
    18. * 但请遵循GPL 
    19. *Thanks to: Google.com 
    20. *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力 
    21. * 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献! 
    22. *********************************************************************/  
    23. int main(int argc, charchar **argv)  
    24. {  
    25. struct sockaddr_in peeraddr;  
    26. struct in_addr ia;  
    27. int sockfd;  
    28. char recmsg[BUFLEN + 1];  
    29. unsigned int socklen, n;  
    30. struct hostent *group;  
    31. struct ip_mreq mreq;  
    32.   
    33. /* 创建 socket 用于UDP通讯 */  
    34. sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
    35. if (sockfd < 0) {  
    36. printf("socket creating err in udptalk\n");  
    37. exit(1);  
    38. }  
    39.   
    40. /* 设置要加入组播的地址 */  
    41. bzero(&mreq, sizeof(struct ip_mreq));  
    42. if (argv[1]) {  
    43.     if ((group = gethostbyname(argv[1])) == (struct hostent *) 0) {  
    44.         perror("gethostbyname");  
    45.         exit(errno);  
    46.     }  
    47. else {  
    48.     printf  
    49.         ("you should give me a group address, 224.0.0.0-239.255.255.255\n");  
    50.     exit(errno);  
    51. }  
    52.   
    53. bcopy((voidvoid *) group->h_addr, (voidvoid *) &ia, group->h_length);  
    54. /* 设置组地址 */  
    55. bcopy(&ia, &mreq.imr_multiaddr.s_addrsizeof(struct in_addr));  
    56.   
    57. /* 设置发送组播消息的源主机的地址信息 */  
    58. mreq.imr_interface.s_addr = htonl(INADDR_ANY);  
    59.   
    60. /* 把本机加入组播地址,即本机网卡作为组播成员,只有加入组才能收到组播消息 */  
    61. if (setsockopt  
    62.         (sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,  
    63.          sizeof(struct ip_mreq)) == -1) {  
    64.     perror("setsockopt");  
    65.     exit(-1);  
    66. }  
    67.   
    68. socklen = sizeof(struct sockaddr_in);  
    69. memset(&peeraddr, 0, socklen);  
    70. peeraddr.sin_family = AF_INET;  
    71. if (argv[2])  
    72.     peeraddr.sin_port = htons(atoi(argv[2]));  
    73.     else  
    74.     peeraddr.sin_port = htons(7838);  
    75.     if (argv[1]) {  
    76.         if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0) {  
    77.             printf("Wrong dest IP address!\n");  
    78.             exit(0);  
    79.         }  
    80.     } else {  
    81.         printf("no group address given, 224.0.0.0-239.255.255.255\n");  
    82.         exit(errno);  
    83.     }  
    84.   
    85. /* 绑定自己的端口和IP信息到socket上 */  
    86. if (bind  
    87.         (sockfd, (struct sockaddr *) &peeraddr,  
    88.          sizeof(struct sockaddr_in)) == -1) {  
    89.     printf("Bind error\n");  
    90.     exit(0);  
    91. }  
    92.   
    93. /* 循环接收网络上来的组播消息 */  
    94. for (;;) {  
    95.     bzero(recmsg, BUFLEN + 1);  
    96.     n = recvfrom(sockfd, recmsg, BUFLEN, 0,  
    97.             (struct sockaddr *) &peeraddr, &socklen);  
    98.     if (n < 0) {  
    99.         printf("recvfrom err in udptalk!\n");  
    100.         exit(4);  
    101.     } else {  
    102.         /* 成功接收到数据报 */  
    103.         recmsg[n] = 0;  
    104.         printf("peer:%s", recmsg);  
    105.     }  
    106. }  
    107. }  

    文件编译:gcc -Wall multi_udp_server.c -o server 

    运行:./server 230.1.1.1 7838


    2、客户端代码(multi_udp_clinet.c)

     
    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
    1. #include <sys/types.h>  
    2. #include <sys/socket.h>  
    3. #include <arpa/inet.h>  
    4. #include <stdio.h>  
    5. #include <stdlib.h>  
    6. #include <string.h>  
    7.   
    8. #define BUFLEN 255  
    9. /********************************************************************* 
    10.  *filename: mcastclient.c 
    11.  *purpose: 演示组播编程的基本步骤,其实这就是一个基本的UDP客户端程序 
    12.  *tidied by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com) 
    13.  Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言 
    14.  *date time:2007-01-25 13:10:00 
    15.  *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途 
    16.  * 但请遵循GPL 
    17.  *Thanks to: Google.com 
    18.  *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力 
    19.  * 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献! 
    20.  *********************************************************************/  
    21. int main(int argc, charchar **argv)  
    22. {  
    23.     struct sockaddr_in peeraddr, myaddr;  
    24.   
    25.     int sockfd;  
    26.     char recmsg[BUFLEN + 1];  
    27.     unsigned int socklen;  
    28.   
    29.     /* 创建 socket 用于UDP通讯 */  
    30.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
    31.     if (sockfd < 0) {  
    32.         printf("socket creating error\n");  
    33.         exit(1);  
    34.     }  
    35.     socklen = sizeof(struct sockaddr_in);  
    36.   
    37.     /* 设置对方的端口和IP信息 */  
    38.     memset(&peeraddr, 0, socklen);  
    39.     peeraddr.sin_family = AF_INET;  
    40.     if (argv[2])  
    41.         peeraddr.sin_port = htons(atoi(argv[2]));  
    42.     else  
    43.         peeraddr.sin_port = htons(7838);  
    44.     if (argv[1]) {  
    45.         /* 注意这里设置的对方地址是指组播地址,而不是对方的实际IP地址 */  
    46.         if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0) {  
    47.             printf("wrong group address!\n");  
    48.             exit(0);  
    49.         }  
    50.     } else {  
    51.         printf("no group address!\n");  
    52.         exit(0);  
    53.     }  
    54.   
    55.     /* 设置自己的端口和IP信息 */  
    56.     memset(&myaddr, 0, socklen);  
    57.     myaddr.sin_family = AF_INET;  
    58.     if (argv[4])  
    59.         myaddr.sin_port = htons(atoi(argv[4]));  
    60.     else  
    61.         myaddr.sin_port = htons(23456);  
    62.   
    63.     if (argv[3]) {  
    64.         if (inet_pton(AF_INET, argv[3], &myaddr.sin_addr) <= 0) {  
    65.             printf("self ip address error!\n");  
    66.             exit(0);  
    67.         }  
    68.     } else  
    69.         myaddr.sin_addr.s_addr = INADDR_ANY;  
    70.   
    71.     /* 绑定自己的端口和IP信息到socket上 */  
    72.     if (bind  
    73.             (sockfd, (struct sockaddr *) &myaddr,  
    74.              sizeof(struct sockaddr_in)) == -1) {  
    75.         printf("Bind error\n");  
    76.         exit(0);  
    77.     }  
    78.   
    79.     /* 循环接受用户输入的消息发送组播消息 */  
    80.     for (;;) {  
    81.         /* 接受用户输入 */  
    82.         bzero(recmsg, BUFLEN + 1);  
    83.         if (fgets(recmsg, BUFLEN, stdin) == (charchar *) EOF)  
    84.             exit(0);  
    85.         /* 发送消息 */  
    86.         if (sendto  
    87.                 (sockfd, recmsg, strlen(recmsg), 0,  
    88.                  (struct sockaddr *) &peeraddr,  
    89.                  sizeof(struct sockaddr_in)) < 0) {  
    90.             printf("sendto error!\n");  
    91.             exit(3);  
    92.         }  
    93.         printf("'%s' send ok\n", recmsg);  
    94.     }  
    95. }  
    编译:gcc -Wall multi_udp_clinet.c -o clinet

    运行:./clinet 230.1.1.1 7838 192.168.1.121 5500


    运行结果图如下:



    只要在客户端,敲入要发的字符,就可以服务器端看到了。


    linux网络编程源代码下载:http://download.csdn.net/detail/yanyuanfen2011/6595113


    如有问题欢迎留言交流!

    展开全文
  • 最近在写一个组播通信的功能,结果发现接受同一台电脑上只能运行一个接收端,如果运行两个时,第二个运行的程序不能收到数据。查找原因是因为没有设置端口数据复用的功能(setsockpot),setsockpot的调用见代码。 ...
  • 目录 1. udp 1.1 udp通信流程 1.2操作函数 send、sendto recv、recvfrom ...2.3广播代码 ...3 组播 ...3.1 组播地址 ...3.2组播通信流程 ...3.3 设置组播属性函数:setsockopt ...3.4 组播代码 4. 本地套接字 4.1 结构体soc...
  • UDP下的广播、组播(多播)-VC6

    热门讨论 2012-08-04 15:16:42
    VC6中,纯C使用SOCKET的示例。实现了UDP下的广播、组播(多播)。代码中注释较为丰富,适合学习使用。版本比较老,就免费了!
  • linux下socket编程(广播组播udp)源码

    热门讨论 2010-08-07 11:13:59
    linux下socket编程,适合初学者。 包括 广播 组播udp 的测试代码, 全部经本人测试通过。 标准C编写,如在windows下,只要稍作修改,即可使用。
  • 项目设计1)流程图2)项目构建3)界面构建4)代码设计a.widget.hb.widget.cppc.secondwidget.hd.secondwidget.cpp3.源代码widget.hwidget.cppsecondwidget.hsecondwidget.cpp 1.简介效果 在之前的文章中,介绍了TCP...
  • 转发:c/c++:UDPudp通信、广播、组播),本地套接字 目录 1. udp 1.1 udp通信流程 1.2 操作函数 send、sendto recv、recvfrom 2. 广播 2.1 广播通信流程 2.2 设置广播属性函数:setsockopt 2.3 ...
  • 目录1. UDP1.1.UDP概念1.2.UDP通信流程1.2.1....特点组播地址UDP组播:通信流程UDP设置组播属性03_multicast_client.c03_multicast_server.c4. 本地套接字结构体通信流程04_localipc_client.c04_localipc_server.c 代码
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非...
  • 测试结果:X86接收组播正常,X64接收报文不正常 代码如下: 1. 初始化组播socket: int ret; udpsockfd[Task[TaskId]->TaskUdpNo].sockfd = ::socket(AF_INET,SOCK_DGRAM,0); //创建socket if...
  • Linux socket 组播示例

    2016-07-12 14:56:50
    最近一直在做linux的网络,现在作...直接上代码吧,一个很简单udp 组播通信的例子,分别为服务器端和客户端的代码。1、服务器端代码 (multi_udp_server.c)#include<sys/types.h> #include<sys/socket.h>...
  • 文章目录广播广播发送setsockopt广播发送示例广播接收代码示例头文件sender.creceiver.c组播网络地址组播发送组播接收加入多播组组播收发 — 示例头文件sender.crecviver.c 广播 前面介绍的数据包发送方式只有一个...
  • Java开发技术大全(500个源代码).

    热门讨论 2012-12-02 19:55:48
    代码范例列表 第1章 示例描述:本章演示如何开始使用JDK进行程序的开发。 HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
    Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非...
  • TCP/IP详解 卷1:协议--源代码

    热门讨论 2012-10-19 12:27:56
    12.4.2 多播组地址到以太网地址的转换 133 12.4.3 FDDI和令牌环网络中的多 134 12.5 小结 134 第13章 IGMP:Internet管理协议 136 13.1 引言 136 13.2 IGMP报文 136 13.3 IGMP协议 136 13.3.1 ...
  • java源码包

    2015-12-01 16:29:37
    Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    另外有只打开一个应用程序、CRichEdit的使用、最小到托盘、自动检测在线用户(多播组)等。 freeeim_FreeEIM_企业即时通讯软件源代码2010年8月份最新版 FTP、HTTP 多线程断点续传下载文件 源码 gdiplus应用实例 ...
  • TCPIP详解--共三卷

    2015-11-30 17:17:21
    12.4.2 多播组地址到以太网地址的转换 133 12.4.3 FDDI和令牌环网络中的多 134 12.5 小结 134 第13章 IGMP:Internet管理协议 136 13.1 引言 136 13.2 IGMP报文 136 13.3 IGMP协议 136 13.3.1 加入一个多播组 ...
  • TCP_IP详解卷1

    热门讨论 2010-12-29 10:53:54
    12.4.2 多播组地址到以太网地址的转换 133 12.4.3 FDDI和令牌环网络中的多 134 12.5 小结 134 第13章 IGMP:Internet管理协议 136 13.1 引言 136 13.2 IGMP报文 136 13.3 IGMP协议 136 13.3.1 加入一个多播组 ...
  • 书中给出了约500个图例,15 000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点,如多、长肥...

空空如也

1 2 3
收藏数 60
精华内容 24
热门标签
关键字:

udp 组播c代码