UDP多播服务器

多播

  组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发 生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。

224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;  
224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet; 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;   
239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。

ip ad

查看网卡编号

if_nametoindex

  将几台电脑分为一个组,同一个组内本身每个电脑都有自己的ip地址,同组的都有一个组号,若想把一个包发给一个组,目的ip设为组号。一对多的数据传输,在ip层存在一个组播的概念,客户端的ip地址没有意义了,客户端要接受的端口号仍然有意义,tcp或udp封装端口号,说明哪个进程接受,一般应用于UDP领域,TCP用的非常少。

   若server要发一个组播包,write(sockfd,buf,buflen);引入一个新的函数setsockopt,可以设置多层协议。

实例:

/* server.c */

#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include<net/if.h>
#include "wrap.h"
#define MAXLINE 80
#define SERV_PORT 8000
#define CLIENT_PORT 9000//客户端的端口号
#define GROUP "239.0.0.2" int main(void)
{
struct sockaddr_in servaddr, cliaddr;//用于IPv4的地址
socklen_t cliaddr_len;
int sockfd;//文件描述符
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];//16 Bytes
struct ip_mreqn group;
ssize_t len;
int i, n;
/*构造用于UDP通信的套接字*/
sockfd = socket(AF_INET, SOCK_DGRAM, 0);// bzero(&servaddr, sizeof(servaddr));//将地址清零
//设置地址
servaddr.sin_family = AF_INET;/*IPv4*/
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//网络字节数,本地任意IP
servaddr.sin_port = htons(SERV_PORT); bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); /*设置组地址*/
inet_pton(AF_INET,GROUP,&group.imr_multiaddr);
/*本地任意IP*/
inet_pton(AF_INET,"0.0.0.0",&group.imr_address);
/*eth0-->编号 命令:ip ad*/
group.imr_ifindex=if_nametoindex("eth0"); setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_IF,&group,sizeof(group)); /*构造client 地址 IP+端口*/
bzero(&clientaddr, sizeof(clientaddr));//将地址清零 //设置地址
  clientaddr.sin_family = AF_INET;/*IPv4*/
  inet_pton(AF_INET,GROUP,&clientaddr.sin_addr.s_addr);
  clientaddr.sin_port=htons(CLIENT_PORT);
  printf("Accepting connections ...\n");   while (1)
{   
    fgets(buf,sizeof(buf),stdin);
    sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&clientaddr,sizeof(clinetaddr));
}
  close(sockfd);
   return 0;
}
/* client.c */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include<net/if.h>
#include <netinet/in.h>
#include "wrap.h"
#define MAXLINE 4096
#define SERVER_PORT 8000
#define CLIENT_PORT 9000
#define GROUP "239.0.0.2”
int main(int argc, char *argv[])
{
struct sockaddr_in serveraddr,localaddr;
int confd;
ssize_t len;
struck ip_mreqn group;//组播结构体
char buf[MAXLINE]; //1.创建一个socket
confd=socket(AF_INET,SOCK_DGRAM,0); //2.初始化本地端地址
bzero(&localaddr,sizeof(localaddr));
localaddr.sin_family=AF_INET;
inet_pton(AF_INET,"0.0.0.0",&localaddr.sin_addr.s_addr);
localaddr.sin_port=htons(CLIENT_PORT);
bind(confd,(struct sockaddr *)&localaddr,sizeof(localaddr)); //加入多播组
inet_pton(AF_INET,GROUP,&group.imr_multiaddr);
inet_pton(AF_INET,"0.0.0.0",&group.imr_address);
group.imr_ifindex=if_nametoindex("eth0"); //设置client加入多播组
setsockopt(confd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&group,sizeof(group)); while(1)
{
len=recvfrom(confd,buf,sizeof(buf),0,NULL,0);
write(STDOUT_FILENO,buf,len);
}
close(confd);
return 0; }

其他常用函数

名字与地址转换:

过时,仅用于IPv4,线程不安全

gethostbyname  通过网址知道ip地址

gethostbyaddr    通过IP地址知道网址

getservbyname
getservbyport 根据服务器程序名字或端口号获取信息,用的不多 getaddrinfo
getnameinfo freeaddrinfo 趋势,可同时处理IPv4和IPv6,线程安全

套接口和地址关联

getsockname

根据accept返回的的sockfd,得到临时端口号

getpeername

根据accept返回的sockfd,得到远端链接的端口号,在exec后可以获取客户端信息
来源https://www.cnblogs.com/rainbow1122/p/7891490.html

linux学习之多高并发服务器篇(三)的更多相关文章

  1. linux学习之多高并发服务器篇(一)

    高并发服务器 高并发服务器 并发服务器开发 1.多进程并发服务器 使用多进程并发服务器时要考虑以下几点: 父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) 系统内创建进程 ...

  2. linux学习之高并发服务器篇(二)

    高并发服务器 1.线程池并发服务器 两种模型: 预先创建阻塞于accept多线程,使用互斥锁上锁保护accept(减少了每次创建线程的开销) 预先创建多线程,由主线程调用accept 线程池 3.多路 ...

  3. Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)(转)

    转自:http://blog.csdn.net/wuyuxing24/article/details/48758927 一, 背景 先说下我要实现的功能,server端一直在linux平台下面跑,当客 ...

  4. PHP写的异步高并发服务器,基于libevent

    PHP写的异步高并发服务器,基于libevent 博客分类: PHP PHPFPSocketLinuxQQ  本文章于2013年11月修改. swoole已使用C重写作为PHP扩展来运行.项目地址:h ...

  5. JAVA NIO non-blocking模式实现高并发服务器(转)

    原文链接:JAVA NIO non-blocking模式实现高并发服务器 Java自1.4以后,加入了新IO特性,NIO. 号称new IO. NIO带来了non-blocking特性. 这篇文章主要 ...

  6. 高并发服务器建议调小 TCP 协议的 time_wait 超时时间。

    1. [推荐]高并发服务器建议调小 TCP 协议的 time_wait 超时时间. 说明:操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接,在高并发访问下,服 务器端会因为处于 ...

  7. JAVA NIO non-blocking模式实现高并发服务器

    JAVA NIO non-blocking模式实现高并发服务器 分类: JAVA NIO2014-04-14 11:12 1912人阅读 评论(0) 收藏 举报 目录(?)[+] Java自1.4以后 ...

  8. 为一个支持GPRS的硬件设备搭建一台高并发服务器用什么开发比较容易?

    高并发服务器开发,硬件socket发送数据至服务器,服务器对数据进行判断,需要实现心跳以保持长连接. 同时还要接收另外一台服务器的消支付成功消息,接收到消息后控制硬件执行操作. 查了一些资料,java ...

  9. 第15章 高并发服务器编程(2)_I/O多路复用

    3. I/O多路复用:select函数 3.1 I/O多路复用简介 (1)通信领域的时分多路复用 (2)I/O多路复用(I/O multiplexing) ①同一线程,通过“拨开关”方式,来同时处理多 ...

随机推荐

  1. MyBatis数据持久化(六)resultMap使用

    resultMap是MyBatis最强大也是最重要的特性,使用它我们可以將查询结果或者sql输入条件和一个HashMap的key进行映射,大大简化了sql查询条件的输入,而且使得数据的查询变得非常灵活 ...

  2. BootStrap学习(三)——重写首页之导航栏和轮播图

    1.按钮 1)帮助文档:http://v3.bootcss.com/css/#buttons 2).btn-lg..btn-sm..btn-xs可以设置按钮的不同尺寸 3).active类设置按钮的激 ...

  3. hiho 172周 - 二维树状数组模板题

    题目链接 描述 You are given an N × N matrix. At the beginning every element is 0. Write a program supporti ...

  4. mybastis_20190323

    1 数据表 items.user.orders.orderdetail user id,username,birthday,sex,address; 使用原生态的jdbc的问题总结? 1 数据库链接问 ...

  5. 《Unix环境高级编程》读书笔记 第4章-文件和目录

    1. stat结构的基本形式: on error 24. 设备特殊文件 每个文件系统所在的存储设备都由其主.次设备号表示. 设备号所用的数据类型是基本系统数据类型dev_t. 主设备号标识设备驱动程序 ...

  6. canvas图片滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  7. ListNode的python 实现

    class Node(object): def __init__(self): self.val = None self.next = None class Node_handle(): def __ ...

  8. execlp(3) - Linux手册

    名称: execl, execlp, execle, execv, execvp, execvpe:执行文件 总览: #include <unistd.h> extern char **e ...

  9. 紫书 例题11-10 UVa 1349 (二分图最小权完美匹配)

    二分图网络流做法 (1)最大基数匹配.源点到每一个X节点连一条容量为1的弧, 每一个Y节点连一条容量为1的弧, 然后每条有向 边连一条弧, 容量为1, 然后跑一遍最大流即可, 最大流即是最大匹配对数 ...

  10. SGU 210 Acdream 1227 Beloved Sons KM

    题目链接:点击打开链接 题意: 给定n个人 每一个人的点权 以下n行i行表示第i个人能够获得哪些数(数字从1-n.且不能反复分配) 若这个人获得了数字则你能够获得他的权值. 要你能获得的权值和最大. ...