UDP服务器

UDP传输不可靠,传输数据的正确率、传输顺序和流量都得不到控制和保证。所以,通常情况下,使用UDP协议进行数据传输,为保证数据的正确性,我们需要在应用层添加辅助校验协议来弥补UDP的不足

与TCP类似,UDP也有可能出现缓冲区被填满后,再接收数据时丢包的现象。由于它没有TCP滑动窗口的机制,通常采用如下方法解决:
1)服务器应用层设计流量控制,控制发送数据速度
2)借助setsockopt函数改变接收缓冲区大小。比如:

#include <sys/socket.h>
int setsockopt(int sockfd,int level,int optname,const void*optval,socklen_t optlen);
int n = 220x1024;
setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&n,sizeof(n));

在这里插入图片描述UDP通信的过程:
服务端:
1)使用函数socket,生成套接字描述符
2)设置struct sockaddr_in结构设置服务器地址和监听端口
3)使用bind()函数绑定监听端口,将套接字文件描述符和地址类型变量 sockaddr_in进行绑定
4)接收客户端的数据,使用recvfrom()函数接收客户端的网络数据;
5)向客户端发送数据,使用sendto()函数向服务器主机发送数据;
6)关闭套接字,使用close()函数释放资源
客户端:
1)使用socket,生成套接字文件描述符
2)通过struct sockaddr_in结构设置服务器地址和监听端口
3)向服务器发送数据,sendto();
4)接收服务器的数据,recvfrom();
5)关闭套接字,clsoe();

1、API

int sendto(int s,const void *buf,int len,unsigned int flags,const struct sockaddr *to,int tolen);

参数说明:
s:socket描述符
buf:UDP数据报缓存区(包含待发送数据)
len:UDP数据的长度
flags:调用方式标志位(一般设置为0)
to:指向接收数据的主机地址信息的结构体(sockaddr_in需类型转换)
tolen:to所指向结构体的长度
返回值说明:
成功则返回实际传送出去的字符数,失败返回-1,错误原因会存于errno中。

int recvfrom(int s,void*buf,int len,unsigned int flags,struct sockaddr*from,int
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值