网络编程Socket通信之UDP

UDP是面向无连接的,所以不要建立连接,直接可以通信。

  • UDP报文格式

 

  • UDP通信一般流程

  UDP通信所需的函数,创建Socket套接字和bind函数相同,没有listen、accept和connect函数。由于TCP是建立连接的,所有在发送和接收数据时,使用send()和recv()函数;而UDP无连接对象,所以在发送和接收数据时,需要明确发送数据的接收方和接收数据时的发送方,使用sendto()和recvfrom()函数。

1.接收数据函数recvfrom

函数原型:

  ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);

功能介绍:

  对于该函数主要的功能是,从客户端或者服务器端接收数据以及发送方的地址信息存储到本地的struct sockaddr类型参数变量当中,如果函数返回-1,所说明接收数据失败,如果返回的是大于等于0的值,则说明函数接收到的数据的大小。因为可以设置文件描述符的状态为阻塞模式,所以在没有接收到数据时,recvfrom会一直处于阻塞状态,直到有数据接收到。

参数说明:

  sockfd是创建socket时的文件描述符;buf用于存储接收到的数据缓冲区,接收的数据将放到这个指针所指向的内容的空间中;len是接收缓冲区的大小;from是指向struct sockaddr的指针,接收发送方地址信息;fromlen是表示第5个参数所指向内容的长度,可以使用sizeof(struct sockaddr)来定义大小,不过因为是要传给内核协议栈,所以使用了指针类型。

2. 发送数据函数sendto

函数原型:

  sizeof_t sendto(int sockfd, const void *buf, size_t len, int flag, const struct sockaddr *to, socklen_t tolen);

功能介绍:

  sendto函数主要根据填充的接收方的地址信息向客户端或者服务器端发送数据,接收方的地址信息会提前设置在struct sockaddr类型的参数指针中,当返回值-1时,表明发送失败,当返回值大于等于0时,表示发送成功,并且发送数据的大小会通过返回值传递回来。

参数说明:

  sockfd是有socket创建的文件描述符;buf是发送数据缓冲区,要发送的数据会放在这个指针指向的内容空间中;len是发送缓冲区的大小;to是一个struct sockaddr类型的指针,其指向地址的内容是接收方地址信息;tolen表示第5个参数指向的数据内容的长度,传递的是值,可以用sizeof(struct sockaddr)计算。

posted @ 2018-11-10 15:14  泪落凝萌  阅读(1462)  评论(0编辑  收藏  举报