不管多么复杂的服务器或客户端程序,其网络通信的基本原理一定如下所述:
对于服务器,其通信流程一般有如下步骤:
1 2 3 4 5 6 | 1. 调用 socket 函数创建 socket(侦听socket) 2. 调用 bind 函数 将 socket绑定到某个ip和端口的二元组上 3. 调用 listen 函数 开启侦听 4. 当有客户端请求连接上来后,调用 accept 函数接受连接,产生一个新的 socket(客户端 socket) 5. 基于新产生的 socket 调用 send 或 recv 函数开始与客户端进行数据交流 6. 通信结束后,调用 close 函数关闭侦听 socket |
---|
对于客户端,其通信流程一般有如下步骤:
1 2 3 4 | 1. 调用 socket函数创建客户端 socket 2. 调用 connect 函数尝试连接服务器 3. 连接成功以后调用 send 或 recv 函数开始与服务器进行数据交流 4. 通信结束后,调用 close 函数关闭侦听socket |
---|
上述流程可以绘制成如下图示:
不管多么复杂的服务器或客户端程序,其网络通信的基本原理一定如下所述:
对于服务器,其通信流程一般有如下步骤:
1 2 3 4 5 6 | 1. 调用 socket 函数创建 socket(侦听socket) 2. 调用 bind 函数 将 socket绑定到某个ip和端口的二元组上 3. 调用 listen 函数 开启侦听 4. 当有客户端请求连接上来后,调用 accept 函数接受连接,产生一个新的 socket(客户端 socket) 5. 基于新产生的 socket 调用 send 或 recv 函数开始与客户端进行数据交流 6. 通信结束后,调用 close 函数关闭侦听 socket |
---|
对于客户端,其通信流程一般有如下步骤:
1 2 3 4 | 1. 调用 socket函数创建客户端 socket 2. 调用 connect 函数尝试连接服务器 3. 连接成功以后调用 send 或 recv 函数开始与服务器进行数据交流 4. 通信结束后,调用 close 函数关闭侦听socket |
---|
上述流程可以绘制成如下图示:
对于上面的图,读者可能有疑问,为什么客户端调用 close() ,会和服务器端 recv() 函数有关。这个涉及到 recv() 函数的返回值意义,我们在下文中详细讲解。
针对这一例子,有具体的实现代码