基于UDP广播的回射服务器
来源:互联网 发布:mac自带的文本编辑器 编辑:程序博客网 时间:2024/05/14 10:04
一、udp广播回射服务器
要求:PC1主机的ip地址是 192.168.222.129,PC2主机的IP地址是192.168.222.130。
PC1和PC2同时运行服务器端程序(该程序中的套接字不用设置为广播)。
通过在终端运行ifconfig命令可以获得,广播地址.
在PC2主机运行该命令结果如下:
内容: 1、首先将客户端程序中的socket, 通过SO_BROADCAST套接字设置广播
2、 因为在linux套接字默认的情况下是禁止发送广播的。
核心源代码如下:
dg_cli_bcast.c
#include "unp.h"static void sig_int(int);void dg_cli(FILE *fp, int sockfd, const struct sockaddr* pservaddr, socklen_t servlen){ int n; const int on = 1; char sendbuf[MAXLINE], recvbuf[MAXLINE]; socklen_t len; struct sockaddr* preply_addr; preply_addr = Malloc(sizeof(struct sockaddr)); setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); signal(SIGALRM, sig_int); while(Fgets(sendbuf, MAXLINE, fp) != NULL){ sendto(sockfd, sendbuf, strlen(sendbuf), 0, pservaddr, servlen); alarm(5); for( ;; ){ len = servlen; if((n = recvfrom(sockfd, recvbuf, MAXLINE, 0, preply_addr, &len)) < 0){ if(errno == EINTR) break; else fprintf(stderr, "recv error from socket\n"); } else{ recvbuf[n] = 0; static char str[128]; struct sockaddr_in *tempaddr = (struct sockaddr_in *) preply_addr; fprintf(stdout, "from %s: %s", inet_ntop(AF_INET, &tempaddr->sin_addr, str, sizeof(128))); } } } free(preply_addr);}static void sig_int(int signo){ fprintf(stdout, "SIGALRM lead to System call\n"); return;}
分析代码:
11-13:设置广播套接字, 并且安装SIGALRM信号。 同时malloc给recvfrom返回的服务器分配空间。
16-24:发送广播信号, 并且调用recvfrom处理应答, 可能会受到多个主机的应答模式。5s后产生SIGALRM信号, 导致recvfrom调用产生EINTR
26-29:处理每个回射服务器的应答, 并且应答和IP一同显示出来。
运行结果如下;
结果分析:
1)、192.168.222.255是该子网范围内的广播地址。我们向该广播地址当中发送数据。
2)、那么数据报就会向连接在该子网当中的所有主机的协议栈向上递交数据。
3)、服务器端端接受到该数据, 就会回射回来。
二、广播和IP分片
1、来至Berklery的内核不允许对广播数据包分片。(原因是:因为广播已经增加了网络的负担, 如果在分片那么更容易造成网络负载严重)。
2、广播地址的数据报大小不能外部接口的MTU(Maximum Transmission Unit, 最大传输单元), 若超过了, 发送的系统将会产生EMSGSIZE错误。
三、总结
1、广播中的ip不可分片原理。
2、了解当中的SIGALRM, 和recvfrom的竞争条件。
3、了解广播风暴产生的原因。
4、为什么我们尽量不要使用广播的原因?
- 基于UDP广播的回射服务器
- 58-基于 UDP 协议的回射服务器
- 基于UDP协议的广播程序实例
- 基于UDP广播的局域网聊天工具
- 基于UDP协议的广播服务
- Qt---基于UDP的网络广播程序
- Qt--基于UDP的网络广播
- 基于UDP的回射服务器研究---未连接UDP漏洞与ICMP错误
- 一个基于UDP数据广播的局域网络会议程序
- 一个基于UDP数据广播的局域网络会议程序
- 一个基于UDP数据广播的局域网络会议程序
- 一个基于UDP数据广播的局域网络会议程序
- LINUX下,编程自学十:基于UDP的广播
- 【PyQt4 实例19】基于UDP的网络广播程序
- 开发基于UDP广播的小型局域网聊天室
- 103-使用广播的 UDP 回射客户端
- 基于UDP协议的Socket服务器
- 基于LwIP socket的UDP服务器
- HTML CSS: the language of web-getting to know HTML
- 机器学习基石作业一PLA算法
- 生物信息脚本练习(2)求反向互补序列
- win2008r2虚拟机架设asp.net步骤
- TCP 三次握手 与 四次分手
- 基于UDP广播的回射服务器
- C++继承详解:共有(public)继承,私有(private)继承,保护(protected)继承
- CSDN-markdown编辑器模板
- CSS3 DIV自适应宽度、水平居中的实现方法
- Huffman
- Django REST Framework(一) 初步使用
- Cygwin安装及Cmdstan-2.16.0在Cygwin下的使用
- 弹出呼叫电话号码
- (Kattis