64-TCP/UDP 混合服务器
来源:互联网 发布:e63诺基亚怎么下载软件 编辑:程序博客网 时间:2024/06/06 00:34
本文将为基本的 UDP 套接字编程这一章画上句号。这一篇文章主要将前面学习过的 TCP 和这一章的 UDP 结合起来,做一个既能接收 TCP 连接,又能接收 UDP 报文的回射服务器程序。
1. 程序路径
代码托管在 gitos 上,请使用下面的命令获取:
git clone https://git.oschina.net/ivan_allen/unp.git
如果你已经 clone 过这个代码了,请使用 git pull
更新一下。本节程序所使用的程序路径是 unp/program/echo_udp/mixecho
。
2. 思路
要想服务器接收处理连接请求,又能接收 UDP 报文,就需要创建两个不同的套接字,其中一个是监听套接字,另一个是 udp 套接字。
如果在监听套接字上发生事件,那就说明对方请求建立 TCP 连接,如果在 udp 套接字上发生事件,那就说明对方发来了 udp 报文。我们可以使用多线程程序来完成这个功能,但是使用 select 会更加方便。
伪代码:
void server_routine() { listenfd = socket(tcp); reuseaddr(listenfd); bind_and_listen(listenfd, servaddr); udpfd = socket(udp); // 想一想,为什么可以绑定同一个套接字地址两次? bind(udpfd, servaddr); FD_SET(listenfd, &fds); FD_SET(udpfd, &fds); while(1) { rfds = fds; select(&rfds); if (listenfd in rfds) { // 处理 tcp 连接 } if (udpfd in rfds) { // 处理 udp 报文 } }}
可以看到,代码结构非常简单清晰。详细代码请参考unp/program/echo_udp/mixecho/echo.cc
.
有一点需要注意的是:udp 的套接字地址与 tcp 的套接字完全一样,但是它们允许重复捆绑,原因在于 TCP 的端口号与 UDP 的端口号尽管数字一样,但它们却是彼此独立的。
3. 实验
- 在 mars 主机上启动服务器
// 默认绑定 INADDR_ANY,端口 8000mars $ ./echo -s
- 在 sun 主机上启动 udp 客户端,需要指定参数 -u
sun $ ./echo -u -h mars
图1 加 -u 选项,以 udp 方式启动客户端
- 在 flower 主机上启动 tcp 客户端
flower $ ./echo -h mars
图2 以 tcp 方式启动客户端
图3 netstat 的输出
4. 总结
- 掌握混合 tcp 与 udp 服务器的编写方法
- tcp 与 udp 的端口号是彼此独立的
0 0
- 64-TCP/UDP 混合服务器
- 测试服务器UDP/TCP丢包率
- 并发TCP服务器和并发UDP服务器
- python学习:编写TCP服务器&UDP服务器
- TCP循环服务器 UDP循环服务器 TCP并发服务器
- 基于混合TCP-UDP的HTTP协议实现方法
- 基于混合TCP-UDP的HTTP协议实现方法
- 基于混合TCP-UDP的HTTP协议实现方法
- 基于混合TCP-UDP的HTTP协议实现方法
- 基于混合TCP-UDP的HTTP协议实现方法
- 基于混合TCP-UDP的HTTP协议实现方法
- 用select模式实现TCP和UDP的混合监听
- 用select模式实现TCP和UDP的混合监听
- java实现TCP与UDP混合传输文件总结
- 用select模式实现TCP和UDP的混合监听
- Linux下TCP/UDP socket服务器模型
- select写的UDP/TCP测试服务器
- 游戏服务器:到底使用UDP还是TCP
- 两个有序链表合并成一个有序链表
- meanshift运动跟踪算法详解
- Linux的diff和git diff生成patch/打patch
- FFmpeg_3.2.4+SDL_2.0.5学习(2)视频同步基础
- <饮水入城> (神坑爆搜)
- 64-TCP/UDP 混合服务器
- 企业级云管理平台的架构实现与落地实践、趋势分析
- LCS相关问题
- 11款Linux下的数据恢复工具
- c#后台直接发起http请求
- struts2自定义拦截器
- Java并发编程实战
- UIButton 设置阴影效果
- 使用花生壳、路由器、个人电脑进行站点部署并实现外网域名访问图文详解(花生壳设置方法 使用方法 使用教程)