您现在的位置是:首页 > 正文

linux主机加入组播组,linux下不同主机间实现组播(练习代码)

2024-04-01 01:05:18阅读 4

在写聊天室程序时,遇到一个组播问题,不能在不同主机上进行发送接收消息。。。

深究发现,是本人对sendto与recvfrom的理解太浅薄。

以下代码发送端与接收端可在同一主机,也可在不同主机上运行。

代码直接编译运行即可。

程序为练习程序,比较难堪,勿怪。

确定是在局域网内。。

不能运行可试着关闭防火墙。。。

以下例子,发送端只能发送消息,接收端只能接收消息。

若两台主机都加入组播组的话,那么它们都能收发消息。代码就不写了

发送端:(此主机未加入组播组)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define MAXBUF 30

#define PORT 5000

char multicast_addr[] = "224.0.1.1 ";

int main(int argc, char *argv[]) {

int s;

char name[MAXBUF] = { '\0' };

struct sockaddr_in srv, mcast;

if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {

perror("Opening socket ");

return 0;

}

memset(&srv, 0, sizeof(srv));

srv.sin_family = AF_INET;

srv.sin_port = htons(PORT);

srv.sin_addr.s_addr = htonl(INADDR_ANY);

memset(&mcast, 0, sizeof(mcast));

mcast.sin_port = htons(PORT);

mcast.sin_family = AF_INET;

mcast.sin_addr.s_addr = inet_addr(multicast_addr);

int opt = SO_REUSEADDR;

setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

if (bind(s, (struct sockaddr*) &srv, sizeof(srv)) < 0) {

perror("bind ");

return 0;

}

/*发送端无需加入组播组,所以以下注释语句可以不要

mreq.imr_multiaddr.s_addr = inet_addr(multicast_addr);

mreq.imr_interface.s_addr = htonl(INADDR_ANY);

if (setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {

perror("setsockopt: IP_ADD_MEMBERSHIP ");

return 0;

}

*/

while (1) {

fgets(name, MAXBUF, stdin);

sendto(s, name, strlen(name), 0, (struct sockaddr*) &mcast, sizeof(mcast));

//此处是mcast!!切记!!

perror("sendto");

}

return 1;

}

接收端:(此主机加入组播组)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define MAXBUF 30

#define PORT 5000

char multicast_addr[] = "224.0.1.1 ";

int main(int argc, char *argv[]) {

int s, n;

char name[MAXBUF] = { '\0' };

struct sockaddr_in srv;

socklen_t srv_len = sizeof(srv);

struct ip_mreq mreq;

if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {

perror("Opening socket ");

return 0;

}

memset(&srv, 0, sizeof(srv));

srv.sin_family = AF_INET;

srv.sin_port = htons(PORT);

srv.sin_addr.s_addr = htonl(INADDR_ANY);

int opt = SO_REUSEADDR;

setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

if (bind(s, (struct sockaddr*) &srv, sizeof(srv)) < 0) {

perror("bind ");

return 0;

}

mreq.imr_multiaddr.s_addr = inet_addr(multicast_addr);

mreq.imr_interface.s_addr = htonl(INADDR_ANY);

if (setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {

perror("setsockopt: IP_ADD_MEMBERSHIP ");

return 0;

}

while (1) {

n = recvfrom(s, name, MAXBUF, 0, (struct sockaddr*) &srv, &srv_len);

//此处是srv,切记!!!

perror("recvfrom");

name[n] = '\0';

fputs(name, stdout);

}

return 1;

}

网站文章

  • 正则表达式总结

    第一点:--------------有关正则前沿介绍 正则表达式是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现。javascript中还会用到。一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。就像通配符“*.jpg”、“%ab%”,它...

    2024-04-01 01:04:52
  • 计算机系统结构李学干课后习题答案,计算机系统结构习题答案(李学干).doc

    计算机系统结构习题解答第一章习题一1.2一台经解释实现的计算机,可以按照功能划分成4级。每一级为了执行一条指令需要下一级的N条指令解释。若执行第1级的一条指令需K纳秒时间,那么执行第2、3、4级的一条...

    2024-04-01 01:04:45
  • 使用 JavaScript 将相对路径转换为绝对路径

    转自:http://baifa.me/2010/01/convert-to-absolute-path.html有时为了唯一标识网址或其它开发需要,我们需要将相对的网址转换为绝对的网址。当然前人实现方式已经不少,但或多或少的存在缺点或兼容问题。下面我将总结已有实现并给出相对完美的实现。常规实现:地址转换因该实现方式千变万化,故略去代码,但在开发时需考虑 base 标签的会带

    2024-04-01 01:04:38
  • python 根据中文表头标题抓取动态(表格)文档数据

    python 根据中文表头标题抓取动态(表格)文档数据

    思路如图左侧表头标题,要获得右侧数据。网页数据提取成汉字,表格数据间会有空格,用split()分隔成list。用index()查找某个汉字表头位置,输出list下一个位置既是要得到值 text2 ='网页纯文本,爬虫数据自己转换' # 字符串分割成列表,Python 分割字符串使用 变量.split("分割标示符号"[分割次数]),分割次数表示分割最大次数,为空则分割所有。...

    2024-04-01 01:04:12
  • 云计算和外包数据安全分析及建议

    本文讲的是云计算和外包数据安全分析及建议,【IT168 资讯】很多企业,要么已经配置了云计算,要么即将配置云计算。云计算是提高灵活性、减少成本的最新技术。通过提供捆绑、可升级的软件、基础设施、数据存储及通信解决方案,云计算供应商使公司节约了资金、避免了高成本IT承诺、获得了基于所需的有效系统规模,并且可迅速配置最新服务。  一。漫步云端前需要考虑的问题 ...

    2024-04-01 01:04:04
  • 二维数组按数字大小选取前top k个数字

    题目描述 二维数组,每行是降序的,且每行的长度不固定,综合选取去重后的前top-k大的数字。 输入: [ [10,9,7,5,2] [8,6,3] [10,9,8,5] ] 选取前top-5大的数字 ...

    2024-04-01 01:03:59
  • 方向导数与梯度

    方向导数与梯度

    导数一元函数的导数,为函数曲线在某一点的切线斜率,求解释可依据求极限思想偏导数多元函数,例如二元函数,函数为一个空间曲面,因此计算某点关于一元变量导数时,必须假定另一元变量是常数,由于不是完全导数,所...

    2024-04-01 01:03:34
  • Spring Boot整合Shiro——基础知识

    自定义SabRealm继承AuthorizingRealm类,并且重写了认证doGetAuthenticationInfo方法和授权doGetAuthorizationInfo方法。特别注意retur...

    2024-04-01 01:03:27
  • OAuth2:开放授权的强大工具

    OAuth2:开放授权的强大工具

    OAuth2,全称Open Authorization 2.0,是一种开放授权协议,它为互联网上的应用提供了一种安全、灵活的身份验证和授权方式。在OAuth2协议下,用户可以将自己的信息授权给第三方应...

    2024-04-01 01:03:20
  • 网络连接失败?提示获取不到服务器的IP地址?教你这么改哈 热门推荐

    网络连接失败?提示获取不到服务器的IP地址?教你这么改哈 热门推荐

    临近下班的时候才调好的网络哎... 后台小哥哥看到同桌发的朋友圈抱怨一天无网,特意跑过来 帮忙修复,但是我的无奈就是不给力,怎么都修复不好,各种可能假设之后(公司网络被监控,IP变更会被拉黑无网,负责人还不在),后台小哥哥把他的有效IP贡献出来给我了,但是但是.....依然无效, 还连累小哥哥也连接不上网络了...很是尴尬呀。于是赶紧掏出手机来问度娘...突然间,...

    2024-04-01 01:03:12