apollo学习之cyber网络IO
Apollo自动驾驶系统中还提供了网络通信的能力。网络通信主要是调用socket嵌套字实现,由于操作系统存在IO多路复用,因此需要调用select、poll或epoll,来监视多个文件描述符,等待文件描述符“准备好“进行IO操作。
附赠自动驾驶最全的学习资料和量产经验:链接
Socket嵌套字
socket网络嵌套字可以创建一个网络连接,通过操作socket嵌套字实现网络通信。socket接口如下
int socket(int domain, int type, int protocol);
其中type类型
-
SOCK_STREAM TCP连接
-
SOCK_DGRAM UDP连接
关于socket更多的介绍可以参考socket。
接口
绑定socket到IP和端口。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
监听嵌套字上的连接
int listen(int sockfd, int backlog);
接受套接字上的连接
int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict addrlen);
在套接字上启动连接
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
从套接字接收消息
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
发送消息
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
关闭连接
int close(int fd);
流程
socket接口的使用流程图如下图所示,图片来源[1]
socket流程,来源于geeksforgeeks
IO多路复用
select、poll和epoll都是用来做IO多路复用的时候,等待描述符准备好进行IO操作,在准备好之后进行读取或者写入操作。select和poll是所有UNIX系统都有的接口,而epoll是linux系统