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的缘故所以就乱了,乱就乱吧。不影响代码内容。

相关推荐