您的位置:首页 > 运维架构 > Linux

linux c socket之局域网广播

2013-11-20 14:59 501 查看
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdbool.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include "Utility.h"
//局域网广播发送,配合该工具检测http://download.csdn.net/download/ben395575481/1796582
static const char * IN6ADDR_ALLNODES="FF02::1";//v6 addr
int main(int argc, char** argv) {
//检测参数
if(argc!=4)
DieWithUserMessage("param","[4][6] <port> <string to send>");
in_port_t port=htons((in_port_t)atoi(argv[2]));
//配置地址结构
struct sockaddr_storage destStoreage;
memset(&destStoreage,0,sizeof(destStoreage));

size_t addr_size=0;
if(argv[1][0]=='4')
{
//使用IP4
struct sockaddr_in *destAddr4=(struct sockaddr_in*)&destStoreage;
destAddr4->sin_family=AF_INET;
destAddr4->sin_port=port;
destAddr4->sin_addr.s_addr=INADDR_BROADCAST;//广播
addr_size=sizeof(struct sockaddr_in);
}else if(argv[1][0]=='6')
{
//使用IP6
struct sockaddr_in6 *destAddr6=(struct sockaddr_in6*)&destStoreage;
destAddr6->sin6_family=AF_INET6;
destAddr6->sin6_port=port;
inet_pton(AF_INET6,IN6ADDR_ALLNODES,&destAddr6->sin6_addr);
addr_size=sizeof(struct sockaddr_in6);
}else{
DieWithUserMessage("Unknown address family",argv[1]);
}
//转化为最后的地址
struct sockaddr *destAddress=(struct sockaddr*)&destStoreage;
size_t msg_len=strlen(argv[3]);
if(msg_len>MAXSTRINGLENGTH)
{
DieWithUserMessage("string too long ",argv[3]);
}
//建立socket
int sock=socket(destAddress->sa_family,SOCK_DGRAM,IPPROTO_UDP);
if(sock<0)
DieWithSystemMessage("socket() failed!");
int broadcastPerm=1;
//设置socket允许发送局域网广播
if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&broadcastPerm,sizeof(broadcastPerm))<0)
{
DieWithSystemMessage("setsockopt() failed!");
}
int i=0;
for(;;)
{
printf("send broadcast %d!\n",i++);
//循环发送广播数据
ssize_t numBytes=sendto(sock,argv[3],msg_len,0,destAddress,addr_size);
if(numBytes<0)
DieWithSystemMessage("sendto() failed!");
else if(numBytes!=msg_len)
DieWithUserMessage("sendto()","sent unexpected number of bytes");
sleep(3);
}

return (EXIT_SUCCESS);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: