设为首页 加入收藏

TOP

Linux下面的C开发---UDP编程
2014-11-24 03:24:52 来源: 作者: 【 】 浏览:1
Tags:Linux 面的 开发 ---UDP 编程

今天废话就不多说了,贴上我写的一个UDP广播传输文件的代码。
程序分为Server端和Client端,Server端负责广播数据,Client就是接受文件。
Server运行的时候首先广播文件名的长度,Client接受到长度后,再接受文件名,最后就是接受文件内容。最后Close文件就完成了。
先送上Server端:
#include
#include
#include
#include
#include
#include
#include
#include


void isException(int r,char *s){
if(r==-1){
printf("%s Error! %m \n",s);
exit(0);
}
printf("%s Success !\n",s);
}


int main(int args,char *argv[]){
int fd;
int ffd;
int r;
int size;
char *fileName;
char buf[1024];
struct sockaddr_in addr;
int opt=1;
//建立Socket
fd=socket(AF_INET,SOCK_DGRAM,0);
isException(fd,"Server Init Socket ");

//设定广播方式
setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt));

//构建IP地址
addr.sin_family=AF_INET;
addr.sin_port=htons(atoi(argv[2]));
inet_aton(argv[1],&addr.sin_addr);

//传送文件名的长度
fileName=argv[3];
size=strlen(fileName);
r=sendto(fd,&size,sizeof(size),0,(struct sockaddr*)&addr,sizeof(addr));
isException(r,"Send FileName Length ");

int k;
for(k=5;k>0;k--){
printf("%d ...\n",k);
sleep(1);
}

//传送文件名
r=sendto(fd,fileName,size,0,(struct sockaddr*)&addr,sizeof(addr));
isException(r,"Send The FileName ");

//打开文件
ffd=open(fileName,O_RDONLY);
isException(ffd,"Open File ");

//循环发送文件内容
while(r!=0){
r=read(ffd,buf,sizeof(buf));
if(r==0){
sendto(fd,buf,0,0,(struct sockaddr*)&addr,sizeof(addr));
break;
}
sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr));
}

close(ffd);
close(fd);
return 0;
}


然后是Client端:
#include
#include
#include
#include
#include
#include
#include
#include




void isException(int r,char *s){
if(r==-1){
printf("%s Error! %m \n",s);
exit(0);
}
printf("%s Success !\n",s);
}


int main(int args,char *argv[]){
int fd;
int ffd;
int r;
int size;
char fileName[256];
char buf[1024];
struct sockaddr_in addr;
int opt=1;
//创建fd
fd=socket(AF_INET,SOCK_DGRAM,0);
isException(fd,"Client Init Socket ");

//设定绑定方式
setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(size));

//构造IP
addr.sin_family=AF_INET;
addr.sin_port=htons(atoi(argv[2]));
inet_aton(argv[1],&addr.sin_addr);
r=bind(fd,(struct sockaddr*)&addr,sizeof(addr));
isException(r,"Client Bind Server ");

//接受文件名长度
r=recv(fd,&size,sizeof(size),0);
isException(r,"Receive The FileName Length ");
printf("%d \n",size);
recv(fd,fileName,size,0);
fileName[size]=0;
printf("%s\n",fileName);

//创建文件
ffd=open(fileName,O_RDWR|O_CREAT|O_EXCL,0666);
isException(ffd,"Creat File ");

while(r!=0){
r=recv(fd,buf,sizeof(buf),0);
if(r==0){
break;
}
write(ffd,buf,r);
}

close(ffd);
close(fd);
return 0;

}


在系统里面格式是整齐的,但是到了这里因为HTML的缘故所以就乱了,乱就乱吧。不影响代码内容。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux下git简单使用教程(以Andro.. 下一篇Linux下面的C开发---Socket编程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·你必须要弄懂的多线 (2025-12-25 04:22:35)
·如何在 Java 中实现 (2025-12-25 04:22:32)
·Java【多线程】单例 (2025-12-25 04:22:29)
·C++中智能指针的性能 (2025-12-25 03:49:29)
·如何用智能指针实现c (2025-12-25 03:49:27)