From 69ff82cb1015b490cf68b9ca801517fe12f206b7 Mon Sep 17 00:00:00 2001 From: invzhi Date: Tue, 12 Dec 2017 09:03:17 +0800 Subject: [PATCH] Update code --- zh/08.1.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/zh/08.1.md b/zh/08.1.md index b1cf3744..484c1bb0 100644 --- a/zh/08.1.md +++ b/zh/08.1.md @@ -5,6 +5,7 @@ Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 + ## Socket如何通信 网络中的进程之间如何通过Socket通信呢?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中需要互相通信的进程,就可以利用这个标志在他们之间进行交互。请看下面这个TCP/IP协议结构图 @@ -71,8 +72,8 @@ func main() { ```Go -func (c *TCPConn) Write(b []byte) (n int, err os.Error) -func (c *TCPConn) Read(b []byte) (n int, err os.Error) +func (c *TCPConn) Write(b []byte) (int, error) +func (c *TCPConn) Read(b []byte) (int, error) ``` `TCPConn`可以用在客户端和服务器端来读写数据。 @@ -84,6 +85,7 @@ func (c *TCPConn) Read(b []byte) (n int, err os.Error) type TCPAddr struct { IP IP Port int + Zone string // IPv6 scoped addressing zone } ``` 在Go语言中通过`ResolveTCPAddr`获取一个`TCPAddr`