在上一篇内容中,我们用TCP协议写出了客户端——服务器,由于本篇内容中要使用到之前所讲的socket、bind等知识,所以在这里也附上前篇内容的链接,大家可以更好理解。
自己动手用c语言写一个基于服务器和客户端(TCP)
今天我们来用另外一个十分重要的传输协议UDP该怎么实现这项功能。
知其然更要知其所以然,我们先来了解一下UDP协议。
UDP传输协议
UDP协议:UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。位于OSI模型中的传输层。UDP不提供数据包分组和组装,不能对数据包进行排序,换句话说,就是不能保证信息发送后能够安全到达。UDP用来支持那些需要在计算机之间传输数据的网络应用。例如网络视频,在线语音系统等等,他有以下特点:
- 无连接: 知道对端的IP和端口号就直接进⾏行传输, 不需要建立连接;
- 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息;
- 面向数据报: 不能够灵活的控制读写数据的次数和数量
相比TCP协议,UDP要简单不少,我们来根据下图具了解一下UDP服务器——客户端的结构模型是怎样
![72ee0c04ceaa613d6f063315d02495a9.png](https://i-blog.csdnimg.cn/blog_migrate/ca65d4256cd6955a3b490e8787af035e.jpeg)
可以和TCP模型比较,看看有什么不同
可以发现,和TCP模型相比,UDP少了监听,链接和接收步骤,这也符合他的特点,毕竟无连接而且不可靠嘛。那么如何具体编写代码呢,我们先来整理一下思路:
- 服务器要做的事情就是:接收内容,并显示,然后发回客户端
- 客户端要做的事情就:发送内容,再接收服务器的回显,再显示出来
这里涉及到了几个新的函数:recvfrom()和sendto
recvfrom(sockfd, buf, sizeof(buf), 0, (SA*)&cliaddr, &addrlen);//用来接收信息参数意义:sockfd:套接字描述字 buf:缓冲区 sizeof(buf):缓冲区大小 0:调用方式,默认值 (SA*)&cliaddr:指明数据从哪里接收 &addrlen:地址的长度,&取数值sendto(sockfd, buf, sizeof(buf), 0, (SA*)&srv_addr, sizeof(srv_addr))//用来发送信息参数意义同上。
下面我们来看看具体的代码应该如何编写(至于本地端口,ip绑定和bind函数的用法在链接文章中已有详细说明,此处再不赘述):
/*客户端*/#include #include #include #include #include #include #include #include typedef struct sockaddr_in SAI;//声明本地端口和地址typedef struct sockaddr SA;int main(int argc, char *argv[]){if (argc < 3){fprintf(stderr, "Usage: %s