说白了,Socket就是服务器跟客户端通讯用的。
网络间如何进行通信?
首先,在网络中,如何判断,“李白”是“李白”而不是“杜甫”呢?
在我们本机中,我们可以通过PID来标识一个唯一进程。
但是在网络中呢?网络并不能通过PID来判断。那网络通过什么呢?通过网络层的“IP”我们可以判断一个唯一的主机,然后通过传输层的“协议+端口号”我们可以判断此主机中的一个应用程序(进程)。
就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是我为什么说“一切皆socket”。
什么是Socket?
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read-->关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
Socket流程
第一阶段,连接阶段(三次握手)
connect在第二个握手阶段返回,accept在第三个阶段返回
第二阶段,读写阶段
万事具备只欠东风,至此服务器与客户已经建立好连接了。可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信!网络I/O操作有下面几组:
read()/write()
recv()/send()
readv()/writev()
recvmsg()/sendmsg()
recvfrom()/sendto()
我推荐使用recvmsg()/sendmsg()函数,这两个函数是最通用的I/O函数,实际上可以把上面的其它函数都替换成这两个函数