4高并发服务器:UDP局域网服务器(组播)



1 UDP局域网服务器

A读出每一个客户端发送过来的数据包,然后fork出子进程,由子进程去处理客户端请求。

B客户端与服务器段交换多个数据报,服务器为每一个客户端连接创建新的socket,在其上bind一个临时端口,然后用该socket处理对应客户端上的所有应答,这个办法要求在客户查看服务器第一个应答中的源端口号。然后后面利用此端口号和服务器进行交互。

2函数声明

int bind(int sockfd, const struct sockaddr*addr,socklen_t addrlen);

3依赖的头文件

#include<sys/types.h>

#include<sys/socket.h>

4函数说明:

addr中端口号为0,则使用临时端口号

注意:UDP是有可能出现接收缓冲区满,再接收数据时丢包。

A改变接收缓冲区大小

int n = 220 * 1024

setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF,&n, sizeof(n));

B服务器应用层设计流量控制,控制发送数据速度。

5组播

组播组可以是永久的也可以是临时的,组播地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的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查看网卡编号

man if_nametoindex,可以查看if_nametoindex的信息。

案例说明:

server.c


#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <net/if.h>

#define SERVER_PORT 8000

#define CLIENT_PORT 9000

#define MAXLINE 1500

#define GROUP "239.0.0.2"

int main(void)

{

int sockfd, i ;

struct sockaddr_in serveraddr, clientaddr;

char buf[MAXLINE];

char ipstr[INET_ADDRSTRLEN];       
/* 16 Bytes */

socklen_t clientlen;

ssize_t len;

struct ip_mreqn group;

/*
构造用于UDP通信的套接字 */

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

bzero(&serveraddr, sizeof(serveraddr));

serveraddr.sin_family = AF_INET;   
/* IPv4 */

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);    
/* 本地任意IP INADDR_ANY = 0 */

serveraddr.sin_port = htons(SERVER_PORT);

bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));

/*设置组地址*/

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——ANY_addr.s_addr);

clientaddr.sin_port = htons(CLIENT_PORT);

while (1) {

fgets(buf, sizeof(buf), stdin);

sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&clientaddr, sizeof(clientaddr));

}

close(sockfd);

return 0;

}

client.c


#include <netinet/in.h>

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <string.h>

#include <stdlib.h>

#include <sys/stat.h>

#include <unistd.h>

#include <fcntl.h>

#include <net/if.h>

#define SERVER_PORT 8000

#define MAXLINE 4096

#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;

char buf[MAXLINE];

/*
组播结构体 */

struct ip_mreqn group;

//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);

/*本地任意IP*/

inet_pton(AF_INET, "0.0.0.0", &group.imr_address);

/* eth0 -->
编号   命令:ip ad */

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;

}

时间: 2024-10-29 19:08:31

4高并发服务器:UDP局域网服务器(组播)的相关文章

支持高并发的IIS Web服务器常用设置

转一篇站长大人的文章 适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 1.应用程序池(Application Pool)的设置:  General->Queue Length设置为65535(队列长度所支持的最大值) Process Model->Idle Time-out设置为0(不让应用程序池因为没有请求而回收)

netty的Udp单播、组播、广播实例+Java的Udp单播、组播、广播实例

网络上缺乏netty的udp的单播.组播案例,经过一番学习总结之后终于把这两个案例调通,下面把这两个案例的代码放在这里分享一下. 首先推荐博文: http://colobu.com/2014/10/21/udp-and-unicast-multicast-broadcast-anycast/#Netty%E4%B8%8E%E5%8D%95%E6%92%AD%EF%BC%8C%E7%BB%84%E6%92%AD netty的Udp单播.组播.广播实例+Java的Udp单播.组播.广播实例, 这些代

Linux 高并发服务器

高并发服务器 一.多进程并发服务器 1. 实现示意图 2. 使用多进程并发服务器时要考虑以下几点: 父进程最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) 系统内创建进程个数(与内存大小相关) 进程创建过多是否降低整体服务性能(进程调度) 3. 使用多进程的方式, 解决服务器处理多连接的问题:     (1)共享 读时共享, 写时复制 文件描述符 内存映射区 -- mmap     (2)父进程 的角色是什么? 等待接受客户端连接 -- accept 有链接: 创建一

高并发IIS Web服务器常用设置

支持高并发的IIS Web服务器常用设置 适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 1.应用程序池(Application Pool)的设置:在IIS应用程序池高级设置中  General(常规)->Queue Length(对列长度)设置为65535(队列长度所支持的最大值) Process Model(进程模型

linux学习之多高并发服务器篇(三)

UDP多播服务器 多播 组播组可以是永久的也可以是临时的.组播组地址中,有一部分由官方分配的,称为永久组播组.永久组播组保持不变的是它的ip地址,组中的成员构成可以发 生变化.永久组播组中成员的数量都可以是任意的,甚至可以为零.那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用. 224.0.0.0-224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用: 224.0.1.0-224.0.1.255是公用组播地址,可以用

高性能、高并发网络通信系统的架构设计

1 引言 随着互联网和物联网的高速发展,使用网络的人数和电子设备的数量急剧增长,其也对互联网后台服务程序提出了更高的性能和并发要求.本文的主要目的是阐述如何进行高并发.高性能网络通信系统的架构设计,以及这样的系统的常用技术,但不对其技术细节进行讨论.本篇只起抛砖引玉的之效,如有更好的设计方案和思路,望您共分享之![注:此篇用select来讲解,如想用epoll,设计思路是一致的] 我们首先来看看课本或学习资料上关于处理并发网络编程的三种常用方案,以及对应的大体思路和优缺点,其描述如下所示:  

线程,锁,高并发

线程 线程(英语:thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.Java 虚拟机允许应用程序并发地运行多个执行线程. Thread类:该类的对象代表一个线程 主要方法: Start()方法: Java虚拟机调用该线程的 run 方法,使该线程开始执行(启动线程) sleep()方法: 限时等待 休眠,sleep有时间 join()方法: 当前线程进入

Netty物联网高并发系统视频教程

Netty物联网高并发系统课程 课程观看地址:http://www.xuetuwuyou.com/course/178 课程出自学途无忧网:http://www.xuetuwuyou.com/ 学会构建netty高并发TCP长连接服务器架构 软件版本: Netty4.1.11 spring4.3.3Release maven3.2 课程目录: 第1节.netty物联网介绍 第2节.Netty服务器编写 第3节.Netty客户端与服务器通信 第4节.编码解码 第5节.Netty服务器架构上 第6节

关于PHP高并发抢购系统设计

内容并发抢购系统注意事项高并发架构设计描述程序端核心代码实现订单流程mysql 端并发解决方案 注意事项(1)高并发环境下,对于服务器cup.内存.网络宽带使用率会瞬间暴涨,需要注意对同服务器上其他应用的影响.(项目解耦,高并发应用独立部署)(2)服务器高负载运行,容易出现死机,重启服务器场景,要提前考虑内存(redis)数据备份与恢复,防止用户抢购数据丢失.(3)高并发应用首先要注重稳定性,其次是性能上优化. (4) 一台服务器能够支持多少并发量nginx服务为例:worker_process