Linux--UDP

UDP简介

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

UDP和TCP协议的区别:

  • 1、连接方面区别

    TCP面向对象连接(如打电话要先拨号建立连接)。

    UDP是无连接的,即发送数据之前不需要建立连接。

  • 2、安全方面的区别

    TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。

    UDP尽最大努力交付,即不保证可靠交付。安全系数低。

  • 3、传输效率的区别

    TCP传输效率相对较低。

    UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。

  • 4、连接对象数量的区别

    TCP连接只能是点到点、一对一的。

    UDP支持一对一,一对多,多对一和多对多的交互通信。

UDP服务端(Server)实现过程:

server.c:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>

int main(int argc,char *argv[])
{
    int port=8888;
    int reuse=1;

    int sock = socket(AF_INET,SOCK_DGRAM,0);
    if(sock < 0){
        perror("socket error");
        return 2;
    }

    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(port);
    local.sin_addr.s_addr = INADDR_ANY;

    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

    if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0){
        perror("bind error");
        return 3;
    }

    int done = 0;
    struct sockaddr_in peer;
    socklen_t len = sizeof(peer);

    char buf[1024];
    while(!done){
        memset(buf,'\0',sizeof(buf));
                printf("Please Enter:");
        recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr*)&peer,&len);
        printf("#########################\n");
        printf("get a client,socket: %s:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));

        printf("client : %s ,echo client!\n",buf);
        printf("#########################\n");

    }
    return 0;
}

客户端(client.c):
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
    if(argc != 2){
        printf("Please Enter: %s [ip] \n",argv[0]);
        return 1;
    }

    int port=8888;

    int sock = socket(AF_INET,SOCK_DGRAM,0);
    if(sock < 0){
        perror("socket error");
        return 2;
    }

    struct sockaddr_in remote;
    remote.sin_family = AF_INET;
    remote.sin_port = htons(port);
    remote.sin_addr.s_addr = inet_addr(argv[1]);



    int done = 0;

    char buf[1024];
    while(!done){
        memset(buf,'\0',sizeof(buf));
        printf("Please Enter:");
        fflush(stdout);
        ssize_t _s = read(0,buf,sizeof(buf)-1 );
        sendto(sock,buf,sizeof(buf),0,(struct sockaddr*)&remote,sizeof(remote));
    }
    return 0;
}

编译服务端:
gcc server.c -o server
编译客户端:
gcc client.c -o client
运行服务端
./server
运行客户端
./client   127.0.0.1
运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45309916/article/details/107378194