udp广播发送数据
//server
#include <;stdio.h>;
#include <;sys/types.h>;
#include <;sys/socket.h>;
#include <;stdlib.h>;
#include <;errno.h>;
#include <;string.h>;
#include <;unistd.h>;
#include <;netinet/in.h>;
#include <;fcntl.h>;
int Udp_Init(char *local_ip,unsigned short local_port,char
*goal_ip,unsigned short goal_port,struct sockaddr_in *sendaddr,int
flag)
{
int i,sockfd,Broadcast;
struct sockaddr_in local_addr;
sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd==-1)
{
close(sockfd);
#ifndef DAMEON
printf( ";socket creat error\n ";);
#else
syslog(LOG_ERR, ";UDP SOCKET Create error\n ";);
#endif
return -1;
}
memset(&;local_addr,0,sizeof(struct sockaddr));
local_addr.sin_family=AF_INET;
local_addr.sin_addr.s_addr=inet_addr(local_ip);
local_addr.sin_port=htons(local_port);
if(bind(sockfd,(struct sockaddr *)&;(local_addr),sizeof(struct
sockaddr))==-1)
{
close(sockfd);
printf( "; %s\n ";,local_ip);
#ifdef DAMEON
syslog(LOG_ERR, ";UDP BIND\n ";);
#else
printf( ";bind error\n ";);
#endif
return sockfd;
}
//ÅÐ?ÏÌ×?Ó×ÖµÄ????ÊÇ?ñΪ?Ç×èÈû??Ê?
if(flag>; 0){
if( (flag=fcntl(sockfd,F_SETFL,0)) <; 0)
#ifndef DAMEON
printf( ";fcntl error\n ";);
#endif
flag |=O_NONBLOCK;
if( fcntl(sockfd,F_SETFL,flag) <; 0)
#ifndef DAMEON
printf( ";fcntl nonblock error\n ";);
#endif
}
if( goal_ip != NULL ){
memset(sendaddr,0,sizeof(struct sockaddr));
sendaddr->; sin_family=AF_INET;
sendaddr->; sin_addr.s_addr=inet_addr(goal_ip);
sendaddr->; sin_port=htons(goal_port);
//ÅÐ?Ï??ËÍIPÊÇ?ñΪ?ã??IP
if( (sendaddr->;sin_addr.s_addr >;>; 24) == 0xff)
{
int Broadcast=1;
sendaddr->; sin_addr.s_addr = htonl(INADDR_BROADCAST);
if( setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(const char
*)&;(Broadcast),sizeof(int)) == -1)
{
close(sockfd);
#ifdef DAMEON
syslog(LOG_ERR, ";UDP BROADCAST SET error\n ";);
#else
printf( "; broadcast setup error\n ";);
#endif
return -1;
}
}
printf(";set sockfd broadcast ok\n";);
}
printf(";sockfd init ok\n";);
return sockfd;
}
int main(int argc, char ** argv)
{
struct sockaddr_in sendaddr;
int sock_fd;
int count=100;
int rec;
if( argc <;3 ){
printf(";usage error input local IP to IP\n";);
return ;
}
if( (sock_fd=Udp_Init(argv[1],9001,argv[2],9001,&;sendaddr,0) ) ==
-1)
{
perror(";udp_init error";);
}
sleep(1);
printf(";socket:%d\n";,sock_fd);
while( count-- ){
rec=0;
rec=sendto(sock_fd, ";hello";,5, 0, (struct sockaddr*)&;sendaddr,
sizeof(struct sockaddr_in));
printf(";sendto len:%d\n";,rec);
rec=0;
usleep(100);
}
}
//client
#include <;stdio.h>;
#include <;sys/types.h>;
#include <;sys/socket.h>;
#include <;stdlib.h>;
#include <;errno.h>;
#include <;string.h>;
#include <;unistd.h>;
#include <;netinet/in.h>;
#include <;fcntl.h>;
#include <;assert.h>;
//========================================================
static int sock_fd;
//========================================================
//name:int udpc_init(void *p)
//args:void *p
//retu:
//func:
//========================================================
int udpc_init(void *p){
int nSize,fBroadcast,count=1;
int port=*(int*)p;
struct sockaddr_in Local_rec_addr;
nSize = sizeof(struct sockaddr);
if( ( sock_fd = socket(AF_INET,SOCK_DGRAM,0) ) <; 0 ){
perror(";socket error";);
return -1;
}
memset(&;Local_rec_addr,0,sizeof(Local_rec_addr));
Local_rec_addr.sin_family=AF_INET;
Local_rec_addr.sin_port = htons(port);
int Broadcast=1;
if( setsockopt(sock_fd,SOL_SOCKET,SO_BROADCAST,(const char
*)&;(Broadcast),sizeof(int)) == -1){
perror(";setsockopt error";);
}
int flag=0;
if(flag >; 0){
if((flag = fcntl(sock_fd,F_SETFL,0)) <; 0 )
#ifndef DAMEON
perror( ";fcntl error\n ";);
#endif
flag |= O_NONBLOCK;
if(fcntl(sock_fd,F_SETFL,flag) <; 0 )
#ifndef DAMEON
perror( ";fcntl nonblock error\n ";);
#endif
}
if( bind(sock_fd,(struct sockaddr
*)&;Local_rec_addr,sizeof(Local_rec_addr)) == -1){
perror(";bind error";);
return -1;
};
return sock_fd;
}
//========================================================
//name:int udpc_getdata(char *buff, int max)
//args:char *, int
//retu:the lenof recevd data.
//func:
//========================================================
int udpc_getdata(char *buff, int max){
printf(";sock_fd:%d\n";,sock_fd);
assert(buff != NULL);
char *buffp=buff;
int count=max;
int tmp;
struct sockaddr_in Remote_rec_addr;
int nSize = sizeof(struct sockaddr);
while(count >;0)
{
tmp= recvfrom(sock_fd,buffp,count, 0,(struct sockaddr
*)&;(Remote_rec_addr), &;nSize) ;
if(tmp <; 0 ){
perror(";recvfrom error";);
break;
}
printf( "; %s:%d\n ";,buffp,tmp);
buffp +=tmp;
count -=tmp;
}
return max-count;
}
//========================================================
//name:int udpc_fina()
//args:
//retu:
//func:
//========================================================
int udpc_fina(){
close(sock_fd);
}
int main(int argc , char ** argv)
{
char buff[2000];
int recvlen;
int udp_port=9001;
memset((char *)buff, 0 , sizeof(buff));
if( udpc_init(&;udp_port) == -1){
perror(";init sock_fd error";);
exit(1);
}
recvlen=udpc_getdata(buff, sizeof(buff));
udpc_fina();
return 0;
}
本文档为【udp广播发送数据】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。