转行程序员浅谈进程间的 socket 通信
我在之前的文章中曾说过,我现在开始负责车辆以太网应用层协议栈的开发和维护。
以太网通信说白了也属于计算机通信的范畴,因此网络通信的5层模型仍然适用于车辆通信领域。
既然设计到ECU间的网络通信,那么socket网络编程的知识一定是必不可少的。
今天这篇文章就总结我这周学习的socket网络编程的知识。
Socket编程常用的函数
首先,下图是client与server之间的通信流程图。
根据上面的socket通信流程图,socket编程常用的函数如下:
客户端使用socket(), connect(), send(), recv(), close();
服务端使用socket(), bind(), listen(), accept(), recv(), send(), close();
Socket通信的三次握手和四次挥手
Socket建立连接三次握手的流程
第一次握手:client端先向server端发送连接请求
第二次握手:server收到后,回复ACK给client
第三次握手:client端收到ACK后,回复ACK给server
至此,client与server之间的网络连接建立,可以顺利进行数据传输。
Socket断开连接四次挥手的流程
第一次挥手:client向server发送断开连接请求
第二次挥手:server收到client的请求,回复ACK给client (这次挥手表示server收到了client的请求,但是并不会立即断开连接,可能还有未发送的数据)
第三次挥手:server向client发送断开连接请求(这次挥手表示server端的数据已经发送完毕,client端可以断开)
第四次挥手:client收到了server的请求,发送ACK给server。之后client端处于等待状态,过了一段时间后将socket关闭
至此,client与server之间的网络连接断开。
简单实现进程间的Socket的通信
实现步骤如下:
(1)使用socket套接字,并选择TCP/IP协议,端口号为6000
(2)客户端发送“this is a test”到服务端
(3)服务端收到后打印字符串,并回复“test ok”到客户端
(4)通信结束,断开连接
客户端socket通信的实现步骤
socket()创建socket
设置socket的属性
connect()向服务端发起连接
send()向服务端发送消息
recv()等待服务端的消息
close()关闭socket,回收资源
服务端socket通信的实现步骤
socket()创建socket
bind()对socket进行绑定
listen()监听绑定的socket,用于监听来自客户端的消息
accept()用于接收客户端的连接请求和消息
recv()函数接收客户端的消息,并将其保存到设置好的buffer中
send()函数用于服务端向客户端发送消息
close()关闭socket,回收资源
代码完成后,使用gcc编译代码,生成server和client的可执行文件。
然后,在linux界面打开两个命令行,先运行server进程,再运行client进程,即可观察到两个进程之间的通信。
总结
这篇文章承接的是之前《白话计算机网络》,但当时工作较忙一直没有更新。
此外,如果想继续学习socket通信和网络协议,推荐一个开源项目tinyhttp。该项目通过500行代码,利用多线程和socket通信简单实现了http协议,是很适合初学者学习的资源,强烈推荐!!!
我这两天正在阅读该项目的源码,等把项目源码吃透,会写一篇总结出来。
参考资料:
https://www.cnblogs.com/niwotaxuexiba/p/9700764.html
https://blog.csdn.net/chenlycly/article/details/51657179
版权声明: 本文为 InfoQ 作者【WB】的原创文章。
原文链接:【http://xie.infoq.cn/article/188dac0e0eee7958939f720e6】。文章转载请联系作者。
评论