select 初识
1 | int select( |
你永远流淌在我的记忆里?River flows in you
No results found
1 | int select( |
SOCK_STREAM 面向连接 准确性/相对较慢 TCP
SOCK_DGRAM 无连接的传输方式 视频/音频 UDP
Server
1. 创建套接字 int sock = socket(AF_INET, SOCK_STREAM, 0);
2. 将套接字和IP、端口绑定 bind(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
3. 进入监听状态,等待客户端请求 listen(…);
accept(…);
4. 接受客户端数据/向客户端发送数据 read(…)/write(…);
5. 关闭套接字 close();
Client
1. 创建套接字
2. 向服务器(特定的IP和端口)发送请求 connect(…);
3. 读取服务器传回的数据/向服务器发送数据 read/write(sock, char*, sizeof(…));
4. 关闭套接字
从项目中一个实例说起,我们的目标是将决策层做出的控制小车的决策(主要是速度velocity还有角速度angular),通过TCP网络传输的方式传递到与控制小车的FPGA相连接的RaspberryPi。也许你会问,为毛要通过网络传输,不能通过其他方式,比如串口,不是会更快点吧?
Maybe…不过,这是有原因的。
其一,我觉得应该通过以太网线直接将运行决策的PC机网卡与树莓派上的网卡直接相连接,再用网络传输,应该比串口快,或者说,更稳定高效。遗憾的是,我们没办法通过以太网线直接相连,而是通过WiFi,这是因为,其二,PC机唯有的一个以太网卡,拿去插激光雷达了,而激光雷达作为一个sensor,是决策所必须的。
其三,整个体系运行在ROS之上,而,把ROS体系中做出来的决策送到控制端的树莓派上,我们得自己想办法或者说Coding。刚好,找到有一个开源的ros通讯,恰好人家是通过TCP传输的,所以,就没想那么多,直接用上了。
可想而知,这个开源的ros通讯要做的,就是把决策层做出来的velocity和angular,通过tcp传送到运行在树莓派上的程序进而控制FPGA控制小车。搞过ROS的应该知道,在ROS中节点都是通过消息进行通讯的,那么,这个ros通讯节点要做的肯定就是订阅决策层做出来的关于控制的消息,然后通过网络传输出去,这些,你可以阅读 这个开源项目 的源码进行了解。