Linux下的TCP/IP编程----UDP篇

之前讲述的都是基于TCP协议的连接和通讯方式,即面向连接的socket方式,接下来我们在考虑一下基于消息的socket是怎样工作的,也就是UDP协议。

首先UDP协议和TCP协议最大的区别就在于是否会始终保持通讯通道的连接。UDP协议(用户数据报协议)不需要在通讯时始终保持连接,一个最形像的例子便是把UDP协议看作是邮局系统,要发送消息的人只需要把需要发送的消息写好地址,贴上邮票投放到邮箱中即可,之后邮递员便会取走信封并送到目的地。在这期间信件有肯呢个丢失或者损坏,但是发送者和接受者都很方便,想什么时候发送就可以直接发送,不需要TCP协议的协商机制。

服务端:

创建套接字——绑定地址——读取发送过来的UDP数据包

创建套接字和绑定地址的方式和之前的TCP并无区别,这里在列一次相关的函数。

1. int socket(int domain,int type, int protocol):创建socket套接字

  • domain (协议族):该参数决定socket使用哪种协议进行通讯

    PF_INET——IPv4协议族
    PF_INET6——-IPv6协议族
    PF_LOCAL——本地通讯的Unix协议族
    PF_PACKET——底层套接字协议族
    PF_IPX——IPX Novell协议族

  • type (套接字类型):该参数决定了socket在协议族的限定下,使用那种方式进行连接

    SOCK_STREAM(面向连接的):

    这种连接方式是要在两个socket端建立一个长连接,在通许期间是不断开的,始终保持连接。所以其在传输过程中数据不会消失,所有的数据都是按照顺序传输,而且传输的数据没有边界限定。

    SOCK_DGRAM(面向消息的):

    这种连接方式在通讯时不需要始终维持一个连接,只需要在进行通讯时将数据进行包裹后向目的socket发出即可。这种连接方式并不是按照数据的顺序依次进行传输,而是把数据分割包装在包裹中,所以数据的可能会发生丢失或者是损毁,而且每次传输限制数据的大小(不能超过每个数据包的大小),所以每次传输是有边界的。

  • protocol (协议):该参数决定了socket在协议族和连接方式的限定下具体使用哪种协议进行通讯

    根据具体选择的协议族和连接方式进行选择,当所选的协议族和连接类型的限定下只有一种协议时,可以传入0作为默认值。

socket()函数成功时返回文件描述符,失败时返回-1

2. int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen):为socket分配(绑定)地址

  • sockfd(socket的文件描述符):服务端的socket描述符

  • myaddr(socket地址):服务端的socket地址

  • addrlen(socket地址长度):服务端的socket地址长度

若成功绑定则返回0,失败则返回-1

客户端:

创建套接字——发送/接受数据包

1. int socket(int domain,int type, int protocol):创建socket套接字

  • domain (协议族):该参数决定socket使用哪种协议进行通讯

    PF_INET——IPv4协议族
    PF_INET6——-IPv6协议族
    PF_LOCAL——本地通讯的Unix协议族
    PF_PACKET——底层套接字协议族
    PF_IPX——IPX Novell协议族

  • type (套接字类型):该参数决定了socket在协议族的限定下,使用那种方式进行连接

    SOCK_STREAM(面向连接的):

    这种连接方式是要在两个socket端建立一个长连接,在通许期间是不断开的,始终保持连接。所以其在传输过程中数据不会消失,所有的数据都是按照顺序传输,而且传输的数据没有边界限定。

    SOCK_DGRAM(面向消息的):

    这种连接方式在通讯时不需要始终维持一个连接,只需要在进行通讯时将数据进行包裹后向目的socket发出即可。这种连接方式并不是按照数据的顺序依次进行传输,而是把数据分割包装在包裹中,所以数据的可能会发生丢失或者是损毁,而且每次传输限制数据的大小(不能超过每个数据包的大小),所以每次传输是有边界的。

  • protocol (协议):该参数决定了socket在协议族和连接方式的限定下具体使用哪种协议进行通讯

    根据具体选择的协议族和连接方式进行选择,当所选的协议族和连接类型的限定下只有一种协议时,可以传入0作为默认值。

socket()函数成功时返回文件描述符,失败时返回-1

服务端/客户端的通讯:

这里我们就要了解一下基于UDP的I/O函数了。

ssize_t sendto(int sock,void buff ,size_t nbytes,int flag , struct sockaddr to_addr,socklen_t *addrlen):向目的地址发送数据

  • sock(socket文件描述符):用于传输数据的socket文件描述符

  • buff(地址指针):用于保存缓冲数据的地址指针

  • nbytes(数据长度):要传输的数据的长度

  • flag(标志位):可选参数,若没有则传入0

  • to_addr(socket地址结构体):存有目的地址的sockaddr结构体变量

  • addrlen(结构体长度):to_addr的长度

若成功则返回传输的字节数,失败则返回-1


ssize_t recvfrom(int sock,void buff,size_t nbytes,int flag, struct sockaddr *from_addr,socklen_t addrlen):接收从某个地址发来的数据

  • sock(socket文件描述符):用于接收数据的socket文件描述符

  • buff(地址指针):用于保存缓冲数据的地址指针

  • nbytes(数据长度):要接收的数据的长度

  • flag(标志位):可选参数,若没有则传入0

  • to_addr(socket地址结构体):存有发送端地址的sockaddr结构体变量

  • addrlen(结构体长度):to_addr的长度

若成功则返回接收的字节数,失败则返回-1


这就是使用UDP进行socket连接时需要了解到的基础知识。相比较TCP,UDP的创建过程更加的简单方便,而且由于不用在通讯过程中始终保持连接,所以更加的节省资源,也更加的方便。接下来我们就可以尝试做一个基于UDP的服务端/客户端程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值