基于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、为什么我们尽量不要使用广播的原因?

原创粉丝点击