C/C++知识点之linux中C语言发送广播报文
小标 2018-09-18 来源 : 阅读 1748 评论 0

摘要:本文主要向大家介绍了C/C++知识点之linux中C语言发送广播报文,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之linux中C语言发送广播报文,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

2. 指令的解决方法:
oute add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1
或者
route add -host 255.255.255.255 dev eth0
 
需要用到函数:setsockopt();
 
setsockopt()函数,用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。
#include 
#include 
函数原型:
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
sockfd:标识一个套接口的描述字。
level:选项定义的层次;支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
optname:需设置的选项。
optval:指针,指向存放选项待设置的新值的缓冲区。
optlen:optval缓冲区长度。
 
example:

#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
int main(){  
    char msg[128] = "I am broadCast message from server!";  
    int brdcFd;  
    if((brdcFd = socket(PF_INET, SOCK_DGRAM, 0)) == -1){  
        printf("socket fail\n");  
        return -1;  
    }  
    int optval = 1;//这个值一定要设置,否则可能导致sendto()失败  
    setsockopt(brdcFd, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &optval, sizeof(int));  
    struct sockaddr_in theirAddr;  
    memset(&theirAddr, 0, sizeof(struct sockaddr_in));  
    theirAddr.sin_family = AF_INET;  
    theirAddr.sin_addr.s_addr = inet_addr("255.255.255.255");  
    theirAddr.sin_port = htons(4001);  
    int sendBytes;  
    if((sendBytes = sendto(brdcFd, msg, strlen(msg), 0,  
            (struct sockaddr *)&theirAddr, sizeof(struct sockaddr))) == -1){  
        printf("sendto fail, errno=%d\n", errno);  
        return -1;  
    }  
    printf("msg=%s, msgLen=%d, sendBytes=%d\n", msg, strlen(msg), sendBytes);  
    close(brdcFd);  
    return 0;  
}

 
SOL_SOCKET注解:
第一个参数socket是套接字描述符。第二个参数level是被设置的选项的级别,如果想要在套接字级别上设置选项,就必须把level设置为 SOL_SOCKET。 option_name指定准备设置的选项,option_name可以有哪些取值,这取决于level,以Linux 2.6内核为例(在不同的平台上,这种关系可能会有不同),在套接字级别上(SOL_SOCKET),option_name可以有以下取 值:
 

    SO_DEBUG,打开或关闭调试信息。

 
    当option_value不等于0时,打开调试信息,否则,关闭调试信息。它实际所做的工作是在sock->sk->sk_flag中置 SOCK_DBG(第10)位,或清SOCK_DBG位。

    SO_REUSEADDR,打开或关闭地址复用功能。

 
    当option_value不等于0时,打开,否则,关闭。它实际所做的工作是置sock->sk->sk_reuse为1或0。

    SO_DONTROUTE,打开或关闭路由查找功能。

 
    当option_value不等于0时,打开,否则,关闭。它实际所做的工作是在sock->sk->sk_flag中置或清 SOCK_LOCALROUTE位。

    SO_BROADCAST,允许或禁止发送广播数据。

 
    当option_value不等于0时,允许,否则,禁止。它实际所做的工作是在sock->sk->sk_flag中置或清 SOCK_BROADCAST位。

    SO_SNDBUF,设置发送缓冲区的大小。

 
    发送缓冲区的大小是有上下限的,其上限为256 * (sizeof(struct sk_buff) + 256),下限为2048字节。该操作将sock->sk->sk_sndbuf设置为val * 2,之所以要乘以2,是防
止大数据量的发送,突然导致缓冲区溢出。最后,该操作完成后,因为对发送缓冲的大小 作了改变,要检查sleep队列,如果有进程正在等待写,将它们唤醒。

    SO_RCVBUF,设置接收缓冲区的大小。

 
    接收缓冲区大小的上下限分别是:256 * (sizeof(struct sk_buff) + 256)和256字节。该操作将sock->sk->sk_rcvbuf设置为val * 2。

    SO_KEEPALIVE,套接字保活。

 
    如果协议是TCP,并且当前的套接字状态不是侦听(listen)或关闭(close),那么,当option_value不是零时,启用TCP保活定时 器,否则关闭保活定时器。对于所有协议,该操
作都会根据option_value置或清 sock->sk->sk_flag中的 SOCK_KEEPOPEN位。

    SO_OOBINLINE,紧急数据放入普通数据流。

 
    该操作根据option_value的值置或清sock->sk->sk_flag中的SOCK_URGINLINE位。

    SO_NO_CHECK,打开或关闭校验和。

 
    该操作根据option_value的值,设置sock->sk->sk_no_check。

    SO_PRIORITY,设置在套接字发送的所有包的协议定义优先权。Linux通过这一值来排列网络队列。

 
    这个值在0到6之间(包括0和6),由option_value指定。赋给sock->sk->sk_priority。

    SO_LINGER,如果选择此选项, close或 shutdown将等到所有套接字里排队的消息成功发送或到达延迟时间后>才会返回. 否则, 调用将立即返回。

 
    该选项的参数(option_value)是一个linger结构:
        struct linger {
            int   l_onoff;    /* 延时状态(打开/关闭) */
            int   l_linger;   /* 延时多长时间 */
        };
如果linger.l_onoff值为0(关闭),则清 sock->sk->sk_flag中的SOCK_LINGER位;否则,置该位,并赋sk->sk_lingertime值为 linger.l_linger。

    SO_PASSCRED,允许或禁止SCM_CREDENTIALS 控制消息的接收。

 
    该选项根据option_value的值,清或置sock->sk->sk_flag中的SOCK_PASSCRED位。

    SO_TIMESTAMP,打开或关闭数据报中的时间戳接收。

 
    该选项根据option_value的值,清或置sock->sk->sk_flag中的SOCK_RCVTSTAMP位,如果打开,则还需 设sock->sk->sk_flag中的SOCK_TIMESTAMP位,同时,将全局变量
netstamp_needed加1。

    SO_RCVLOWAT,设置接收数据前的缓冲区内的最小字节数。

 
    在Linux中,缓冲区内的最小字节数是固定的,为1。即将sock->sk->sk_rcvlowat固定赋值为1。

    SO_RCVTIMEO,设置接收超时时间。

 
    该选项最终将接收超时时间赋给sock->sk->sk_rcvtimeo。

    SO_SNDTIMEO,设置发送超时时间。

 
    该选项最终将发送超时时间赋给sock->sk->sk_sndtimeo。

    SO_BINDTODEVICE,将套接字绑定到一个特定的设备上。

 
    该选项最终将设备赋给sock->sk->sk_bound_dev_if。

    SO_ATTACH_FILTER和SO_DETACH_FILTER。  

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 0
看完这篇文章有何感觉?已经有2人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程