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
时间: 2024-10-13 11:22:58

linux网络编程-(socket套接字编程UDP传输)的相关文章

Python网络编程—socket套接字编程(UDP)

套接字介绍 1.套接字 : 实现网络编程进行数据传输的一种技术手段 2.Python实现套接字编程:import socket 3.套接字分类 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案.(面向连接--tcp协议--可靠的--流式套接字) 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案.(无连接--udp协议--不可靠--数据报套接字) UDP套接字编程 服务端流程 1.创建数据报套接字 sockfd = socket

Python网络编程—socket套接字编程(TCP)

套接字介绍 1.套接字 : 实现网络编程进行数据传输的一种技术手段 2.Python实现套接字编程:import socket 3.套接字分类 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案.(面向连接--tcp协议--可靠的--流式套接字) 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案.(无连接--udp协议--不可靠--数据报套接字) tcp套接字 服务端流程 1.创建套接字 sockfd=socket.socket

VC网络编程 Socket套接字编程

基于TCP的Socket编程 TCP服务器: #include<winsock2.h> //包含头文件 #include<stdio.h> #include<windows.h> #pragma comment(lib,"WS2_32.lib") //显式连接套接字库 int main() //主函数开始 { WSADATA data; //定义WSADATA结构体对象 WORD w=MAKEWORD(2,0); //定义版本号码 char szte

Visual C++网络编程--Socket套接字编程

套接字:一种在网络中不同主机之间进行数据交换的通信桥梁,人们所使用的网络通信软件功能均是基于Socket套接字作为通信桥梁实现. 寻址方式:在Winsock中,用户可以使用TCP/IP地址家族中统一的套接字地址结构解决TCP/IP寻址中可能出现的问题,定义如下 1 struct sockaddr_in{ 2 short sin_family; //指定地址家族即地址格式 3 unsigned short sin_port; //端口号码 4 struct in_addr sin_addr; //

19、网络编程 (Socket套接字编程)

网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤.网线提供的驱动. 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络. 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议. 应用层:主要负责应用程序的协议,例如

linux网络环境下socket套接字编程(UDP文件传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

socket 套接字编程

目录 SOCKET 一.基于TCP协议的socket套接字编程 1.1 什么是socket 1.2 套接字分类 1.3 套接字工作流程 二.基于udp协议的套接字编程 三.UDP协议和TCP协议的区别 3.1 udp协议的特点 3.2 UDP和TCP的区别 SOCKET 一.基于TCP协议的socket套接字编程 1.1 什么是socket ? socket是应用层和传输层之间的一个抽象层,我们经常把socket称为套接字,它是一组接口,把TCP/IP层的复杂操作抽象为几个简单的接口供应用层调用

基于TCP协议的socket套接字编程

基于TCP协议的socket套接字编程 一.什么是Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的. [ 注意:也有

网络通讯之套接字编程

#include<stdio.h> #include<sys/socket.h> #include<netinet/in.h> static char out_ip[15] = "52.0.10.188"; static int out_port = 8888; int main() { char sSendBuf[2049], sRecvBuf[2049]; int connfd = 0, iRet = 0, iSendLen = 0; struc