Linux下面的C开发---UDP编程
今天废话就不多说了,贴上我写的一个UDP广播传输文件的代码。
程序分为Server端和Client端,Server端负责广播数据,Client就是接受文件。
Server运行的时候首先广播文件名的长度,Client接受到长度后,再接受文件名,最后就是接受文件内容。最后Close文件就完成了。
先送上Server端:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>
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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>
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的缘故所以就乱了,乱就乱吧。不影响代码内容。