一个简单的Linux下组播通信的例子
来源:互联网 发布:mac照片 编辑:程序博客网 时间:2024/05/29 11:17
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <errno.h>
#include <netinet/in.h>
#define PORTNUM 5000
#define GROUPIP "224.0.1.1"
int main()
{
int sock_id;
struct sockaddr_in addr;
char buf[] = "This is a test message.";
socklen_t len;
int ret;
/* open a socket. only udp support multicast */
if ((sock_id = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket error");
exit(1);
}
/* build address */
memset((void*)&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(GROUPIP); /* multicast group ip */
addr.sin_port = htons(PORTNUM);
len = sizeof(addr);
while (1) {
/* it's very easy, just send the data to the address:port */
ret = sendto(sock_id, buf, strlen(buf), 0,
(struct sockaddr *)&addr, len);
if (ret < 0) {
perror("sendto error");
exit(1);
}
printf("Send to %s:%u\n",
inet_ntoa(addr.sin_addr.s_addr), ntohs(addr.sin_port));
sleep(2); /* wait 2 sec. */
}
close(sock_id);
return 0;
}
接收端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <errno.h>
#include <netinet/in.h>
#define PORTNUM 5000
#define GROUPIP "224.0.1.1"
#define BUFLEN 1024
#define TESTNUM 10
int main()
{
int sock_id;
struct sockaddr_in addr, sender;
struct ip_mreq ipmr;
char buf[BUFLEN];
socklen_t len;
int ret;
int count;
/* Step 1: open a socket, and bind */
if ((sock_id = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket error");
exit(1);
}
memset((void*)&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(PORTNUM);
if (bind(sock_id, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind error");
exit(1);
}
/* Step 2: fill in a struct ip_mreq */
memset((void*)&ipmr, 0, sizeof(ipmr));
ipmr.imr_multiaddr.s_addr = inet_addr(GROUPIP); /* multicast group ip */
ipmr.imr_interface.s_addr = htonl(INADDR_ANY);
/* Step 3: call setsockopt with IP_ADD_MEMBERSHIP to support receiving multicast */
if (setsockopt(sock_id, IPPROTO_IP, IP_ADD_MEMBERSHIP, &ipmr, sizeof(ipmr)) < 0) {
perror("setsockopt:IP_ADD_MEMBERSHIP");
exit(1);
}
/* Step 4: call recvfrom to receive multicast packets */
len = sizeof(sender);
count = 0;
while (count < TESTNUM) {
ret = recvfrom(sock_id, buf, BUFLEN, 0, (struct sockaddr *)&sender, &len);
buf[ret] = '\0';
if (ret < 0) {
perror("recvfrom error");
exit(1);
}
printf("%d. Receive from %s:%u\n", count,
inet_ntoa(sender.sin_addr.s_addr), ntohs(sender.sin_port));
printf("\tpacket data: %s\n", buf);
}
/* Step 5: call setsockopt with IP_DROP_MEMBERSHIP to drop from multicast */
if (setsockopt(sock_id, IPPROTO_IP, IP_DROP_MEMBERSHIP, &ipmr, sizeof(ipmr)) < 0) {
perror("setsockopt:IP_DROP_MEMBERSHIP");
exit(1);
}
/* Step 6: close the socket */
close(sock_id);
return 0;
}
- 一个简单的Linux下组播通信的例子
- 一个最简单的Socket通信例子
- 一个最简单的Socket通信例子
- 一个最简单的Socket通信例子
- 一个LINUX下管道通信的例子
- linux两个程序通过共享内存通信的一个简单例子
- linux两个程序通过共享内存通信的一个简单例子
- Linux 自虐之路(三): 一个简单的TCP通信例子
- 一个超简单的ring3与ring0通信的例子
- 一个简单的Java UDP协议通信的例子
- 一个最简单的socket通信的例子
- 一个关于linux socket的简单例子
- 一个关于linux socket的简单例子
- 一个关于linux socket的简单例子
- linux 一个简单的进程创建例子
- Qt学习 之 Socket通信(一个简单的例子)
- 一个javaSocket通信的例子
- 一个简单的例子
- linux中ln命令的使用方法
- Oracle随机函数包dbms_random使用示例
- Android学习4--应用程序权限
- Ruby之父松本行弘:编程是可以干一辈子的
- Android Service学习之AIDL, Parcelable和远程服务
- 一个简单的Linux下组播通信的例子
- JIRA项目管理中使用多个权限模型隔离管理多个项目模式的配置
- Tlbimp.exe、ildasm.exe位置
- 英语面试问题
- HTML 5 Web开发:防止浏览器假死的方法
- Linux 用户(user)和用户组(group)管理概述
- 使用SHBrowseForFolder函数打开文件目录对话框
- c#之旅
- word2007(/2010)没有标题2-标题9