您的位置:首页 > 理论基础 > 计算机网络

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

2016-05-28 16:56 337 查看
之前讲述的都是基于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的服务端/客户端程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket linux UDP