• linux网络编程(socket套接字编程UDP传输)


    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作!

    在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输。

    在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux网络编程中,使用UDP进行传输属于比较简单的操作,所以直接上代码吧,详细的讲解我将会在之后上传!

    client(客户端):

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include "protocol.h"
    
    /*--------------------------*/
    int socketfd ;
    int addrlen;
    struct sockaddr_in server;
    struct protocol sentbuf;
    struct protocol recvbuf;
    int num;
    char ip[20];
    int port;
    int choice ;
    char filename[100];
    
    /*--------------------------*/
    void ShowMenu();
    void DownLoad();
    void UpLoad();
    void ShutDown();
    
    
    int main(){
    /*---------------------------*/
        socketfd = socket(AF_INET , SOCK_DGRAM , 0 );
        if(socketfd == -1){
            perror("socket failed!\n");
            exit(1);
        }
    /*---------------------------*/
        printf("please input ip of server:\n");
        scanf("%s",ip);
        printf("please input port of server:\n");
        scanf("%d",&port);
    /*---------------------------*/
        bzero(&server , sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(port);
        server.sin_addr.s_addr = inet_addr(ip);
        addrlen = sizeof(server);
    /*---------------------------*/
        while(1){
            ShowMenu();
            scanf("%d",&choice);
            if(choice == DOWNLOAD){
                printf("client download!\n");
                DownLoad();
            }
            else if(choice == UPLOAD){
                UpLoad();
            }
            else if(choice == SHUTDOWN){
                printf("client shutdown!\n");
                ShutDown();
                break;
            }
            else{
                printf("please input the right choice!\n");
            }
        }
        close(socketfd);
        return 0;
    }
    
    void ShowMenu(){
        printf("please make a choice:\n");
        printf("0:shutdown!\n");
        printf("1:download!\n");
        printf("2:upload!\n");
    }
    
    void DownLoad(){
        bzero(&recvbuf , sizeof(recvbuf));
        bzero(&sentbuf , sizeof(sentbuf));
        bzero(filename , sizeof(filename));
        printf("please input the filename:\n");
        scanf("%s",sentbuf.buf);
        sentbuf.command = DOWNLOAD;
        sendto(socketfd , &sentbuf , sizeof(sentbuf), 0 , (struct sockaddr*)&server , sizeof(server));
        bcopy(sentbuf.buf , filename , sizeof(sentbuf.buf));
        recvfrom(socketfd  , &recvbuf , sizeof(recvbuf) , 0 , (struct sockaddr*)&server , &addrlen);
        printf("recvbuf:%d\n",recvbuf.command);
        if(recvbuf.command == YES){
            printf("YES!\n");
            int choice_1;
            printf("if you input a 5 , the file transmission start!\n");
            scanf("%d",&choice_1);
            if(choice_1 == START){
                sentbuf.command = START;
                sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&server , sizeof(server));
                int no = 0 ;
                int fd = open(filename , O_CREAT | O_TRUNC | O_WRONLY , 0644 );
                if(fd < 0){
                    perror("creat file is failed!\n");
                    exit(1);
                }
                bzero(&recvbuf , sizeof(recvbuf));
                while( ( num = recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , 0 , (struct sockaddr*)&server , &addrlen)) > 0){
                    if( recvbuf.command == CONTENT ){
                        if(no == recvbuf.no){
                            write(fd , recvbuf.buf , recvbuf.len);
                            bzero(&recvbuf , sizeof(recvbuf));
                        }
                        else{
                            perror("The file no is not same,  Some massage is missed!error occured!\n");
                            break;
                        }
                    }
                    if( recvbuf.command == END){
                        close(fd);
                        printf("transmission is successful!\n");
                        break;
                    }
                }
            }
        }
        else if(recvbuf.command == NO){
            perror("No such file on server!\n");
        }
        else{
            perror("recvbuf.command error!\n");
            exit(1);
        }
    }
    
    void ShutDown(){
        sentbuf.command = SHUTDOWN;
        sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&server , sizeof(server));
        printf("client is end!\n");
    }
    
    void UpLoad(){
        bzero(&recvbuf , sizeof(recvbuf));
        bzero(&sentbuf , sizeof(sentbuf));
        bzero(filename , sizeof(filename));
        printf("please input you want to upload filename:\n");
        scanf("%s",sentbuf.buf);
        sentbuf.command = UPLOAD;
        sendto(socketfd , &sentbuf , sizeof(sentbuf), 0 , (struct sockaddr*)&server , sizeof(server));
        bcopy(sentbuf.buf , filename , sizeof(sentbuf.buf));
        int fd ;
        fd = open(filename , O_RDONLY);
        if(fd < 0){
            perror("The file is not exist!\n");
            exit(1);
        }
        recvfrom(socketfd , &recvbuf , sizeof(recvbuf), 0 , (struct sockaddr*)&server , &addrlen);
        if( recvbuf.command == START ){
            int no = 0 ;
            while( ( num = read(fd , sentbuf.buf , INFOLEN)) > 0 ){
                sentbuf.no = no ;
                sentbuf.command = CONTENT;
                sentbuf.len = strlen(sentbuf.buf);
                sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&server,sizeof(server));
                no++;
                bzero(&sentbuf , sizeof(sentbuf));
            }
            bzero(&sentbuf , sizeof(sentbuf));
            sentbuf.command = END;
            sendto(socketfd , &sentbuf , sizeof(sentbuf) , 0 , (struct sockaddr*)&server , sizeof(server));
        }
        else if(recvbuf.command == NO){
            printf("not transmission!\n");
        }
        else{
            perror("error! wrong choice!\n");
        }
    }

    server(服务端):

        #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include "protocol.h"
    
    /*-----------------------变量声明区------------------*/
        int socketfd;
        int addrlen;
        struct sockaddr_in server;
        struct sockaddr_in client;
        struct protocol sentbuf;
        struct protocol recvbuf;
        int num;
        char ip[20];
        int port;
        int choice;
    
    int main(){
    
        /*-------------create UDP socket------------*/
        if((socketfd = socket(AF_INET,SOCK_DGRAM,0)) == -1){
            perror("socket error\n");
            exit(1);
        }
    
        /*-----------------IO-----------------------*/
        printf("Please input the ip:\n");
        scanf("%s",ip);
        printf("Please input the port:\n");
        scanf("%d",&port);
    
        /*-----------------bind----------------------*/
        bzero(&server,sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(port);
        server.sin_addr.s_addr = inet_addr(ip);
        if (bind(socketfd,(struct sockaddr *)&server,sizeof(server)) == -1){
            perror("bind error\n");
            exit(1);
        }
    
        /*---------------------调试信息------------
        addrlen = sizeof(client);
        recvfrom(socketfd,&recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&client,&addrlen);
        num = strlen(recvbuf.buf);
        recvbuf.buf[num] = '\0';
        printf("command %d\n",recvbuf.command );
        printf("len %d\n",recvbuf.len );
        printf("no %d\n", recvbuf.no);
        printf("buf %s\n",recvbuf.buf ); */
    
        addrlen = sizeof(client);
        while(1){
        bzero(&recvbuf,sizeof(recvbuf));
        num =recvfrom(socketfd,&recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&client,&addrlen);
        choice = recvbuf.command;
        if(choice == DOWNLOAD){
            char buf[100];
            int fd;
            fd = open((recvbuf.buf),O_RDONLY);
            if(fd <0){
                sentbuf.command = NO;
                sendto(socketfd,&sentbuf,sizeof(sentbuf),0,(struct sockaddr *)&client,sizeof(client));
                printf("no such file!\n");
                exit(1);
            }
            else{
                sentbuf.command = YES;
                sendto(socketfd,&sentbuf,sizeof(sentbuf),0,(struct sockaddr *)&client,sizeof(client));
                recvfrom(socketfd,&recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&client,&addrlen);
                if(recvbuf.command == START){
                    int no =0;
                    while((num = read(fd,sentbuf.buf,INFOLEN)) >0){
                        sentbuf.no = no;
                        sentbuf.command = CONTENT;
                        sentbuf.len = strlen(sentbuf.buf);
                        sendto(socketfd,&sentbuf,sizeof(sentbuf),0,(struct sockaddr *)&client,sizeof(client));
                        no++;
                        bzero(&sentbuf,sizeof(sentbuf));
                    }
                    bzero(&sentbuf,sizeof(sentbuf));
                    sentbuf.command = END;
                    sendto(socketfd,&sentbuf,sizeof(sentbuf),0,(struct sockaddr *)&client,sizeof(client));
                }
            }
        }
        else if(choice == UPLOAD){
            printf("The client want to upload the file:  %s\n",recvbuf.buf);
            printf("Please choice start or no? \n");
            printf("5 :start,  4: no\n");
            scanf("%d",&sentbuf.command);
            sendto(socketfd,&sentbuf,sizeof(sentbuf),0,(struct sockaddr *)&client,sizeof(client));
            if(sentbuf.command ==START){
                int no =0;
                int fd =open(recvbuf.buf,O_CREAT | O_TRUNC |O_WRONLY,0644);
                if(fd < 0){
                    perror("create file error\n");
                    exit(1);
                }
                bzero(&recvbuf,sizeof(recvbuf));
                while((num = recvfrom(socketfd,&recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&server,&addrlen)) >0){
                    if(recvbuf.command == CONTENT){
                        if(no == recvbuf.no){
                        write(fd,recvbuf.buf,recvbuf.len);
                        printf("kkk%s\n",recvbuf.buf );
                        bzero(&recvbuf,sizeof(recvbuf));
                    }
                    else{
                        perror("The file no is not same.Some message is missed! error occured! \n");
                        break;
                    }
                    }
                    if(recvbuf.command == END){
                        close(fd);
                        printf("transmission is successful!\n");
                        break;
                    }
                }
            }
            else if(sentbuf.command == NO){
                printf("Not to trans the file\n");
            }
            else{
                perror("error! wrong choice!\n");
                exit(1);
            }
    
        }
        else if (recvbuf.command == SHUTDOWN){
            printf("Now the server is shutdown!\n");
            break;
        }
    }
        
        /*----------------------close ----------*/
        close(socketfd);
        return 0;
    }

    makefile:

    main:udpserver.o udpclient.o
        gcc -o udpserver udpserver.o
        gcc -o udpclient udpclient.o
    udpserver.o:udpserver.c
        gcc -c udpserver.c
    udpclient.o:udpclient.c
        gcc -c udpclient.c
  • 相关阅读:
    Linux运维工程师需要掌握什么才能胜任工作呢
    我眼中的Linux系统和红帽RHCE认证
    Linux系统从零到高手的进阶心得
    我在大学毕业后学习Linux系统的心得经验
    装RAC跑脚本报错
    Oracle rac11g 安装报INS41112
    Oracle升级11.2.0.3-11.2.0.4(Windows)
    防存储掉线安装监控软件
    跨平台迁移数据库windows-Linux
    linux crontab -e生成日期格式
  • 原文地址:https://www.cnblogs.com/turnips/p/4915782.html
Copyright © 2020-2023  润新知