<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[[实践成功]go tcp tcpclient编码]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Wed, 30 Dec 2020 08:55:50 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	Server：echoServer.go<br/><textarea name="code" class="php" rows="15" cols="100">
/**
 * File: echoServer.go
 * Author: 蛇叔
 * 公众号: 蛇叔编程心法(snakeCodeHeart)
 */
package main

import (
&nbsp;&nbsp;&quot;fmt&quot;
&nbsp;&nbsp;&quot;net&quot;
&nbsp;&nbsp;&quot;os&quot;
&nbsp;&nbsp;&quot;syscall&quot;
)

const (
&nbsp;&nbsp;PORT = 8888
&nbsp;&nbsp;ADDR = &quot;127.0.0.1&quot;
&nbsp;&nbsp;SIZE = 100
)

func main() &#123;
&nbsp;&nbsp;// 1. create socketfd
&nbsp;&nbsp;socketFd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
&nbsp;&nbsp;if err != nil &#124;&#124; socketFd &lt; 0 &#123;
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;socket create err: &quot;, err)
&nbsp;&nbsp;&nbsp;&nbsp;os.Exit(-1)
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;// 2. bind addr and port
&nbsp;&nbsp;ip4 := net.ParseIP(ADDR).To4()
&nbsp;&nbsp;if ip4 == nil &#123;
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;net.ParseIP err&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;os.Exit(-1)
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;sa := &amp;syscall.SockaddrInet4&#123;Port: PORT&#125;
&nbsp;&nbsp;copy(sa.Addr[:], ip4)

&nbsp;&nbsp;err = syscall.Bind(socketFd, sa)
&nbsp;&nbsp;if err != nil &#123;
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;socket bind err: &quot;, err)
&nbsp;&nbsp;&nbsp;&nbsp;os.Exit(-1)
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;// 3. listen
&nbsp;&nbsp;err = syscall.Listen(socketFd, 128)
&nbsp;&nbsp;if err != nil &#123;
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;socket listen err: &quot;, err)
&nbsp;&nbsp;&nbsp;&nbsp;os.Exit(-1)
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;// 4. accept
&nbsp;&nbsp;acceptFd, _, err := syscall.Accept(socketFd)
&nbsp;&nbsp;if err != nil &#123;
&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;socket accept err: &quot;, err)
&nbsp;&nbsp;&nbsp;&nbsp;os.Exit(-1)
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;var (
&nbsp;&nbsp;&nbsp;&nbsp;buf = make([]byte, SIZE)
&nbsp;&nbsp;&nbsp;&nbsp;readn int
&nbsp;&nbsp;&nbsp;&nbsp;err2 error
&nbsp;&nbsp;)

&nbsp;&nbsp;for &#123;
&nbsp;&nbsp;&nbsp;&nbsp;// 5. read data
&nbsp;&nbsp;&nbsp;&nbsp;readn, err2 = syscall.Read(acceptFd, buf)
&nbsp;&nbsp;&nbsp;&nbsp;if err2 != nil &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;if readn &gt; 0 &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 6. write data
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writen, _ := syscall.Write(acceptFd, buf[:readn])
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if writen &lt; 0 &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;socket write err: &quot;, err)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if readn == 0 &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;客户端已关闭&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if readn &lt; 0 &amp;&amp; err2 != nil &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;socket read err: &quot;, err2.Error())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;// 7. close
&nbsp;&nbsp;_ = syscall.Close(acceptFd)
&nbsp;&nbsp;_ = syscall.Close(socketFd)
&#125;

</textarea><br/><br/>Client：echoClient.go<br/><textarea name="code" class="php" rows="15" cols="100">
/**
 * File: echoClient.go
 * Author: 蛇叔
 * 公众号: 蛇叔编程心法
 */
package main

import (
&nbsp;&nbsp;&nbsp;&nbsp;&quot;bufio&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&quot;fmt&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&quot;net&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&quot;os&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&quot;syscall&quot;
)

const (
&nbsp;&nbsp;&nbsp;&nbsp;PORT = 8888
&nbsp;&nbsp;&nbsp;&nbsp;ADDR = &quot;127.0.0.1&quot;
&nbsp;&nbsp;&nbsp;&nbsp;SIZE = 100
)

func main() &#123;

&nbsp;&nbsp;&nbsp;&nbsp;// 1. 建立socket
&nbsp;&nbsp;&nbsp;&nbsp;socketFd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
&nbsp;&nbsp;&nbsp;&nbsp;if err != nil &#124;&#124; socketFd &lt; 0 &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;socket create err: &quot;, err)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.Exit(-1)
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;ip4 := net.ParseIP(ADDR).To4()
&nbsp;&nbsp;&nbsp;&nbsp;if ip4 == nil &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;net.ParseIP err&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.Exit(-1)
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;sa := &amp;syscall.SockaddrInet4&#123;Port:PORT&#125;
&nbsp;&nbsp;&nbsp;&nbsp;copy(sa.Addr[:], ip4)

&nbsp;&nbsp;&nbsp;&nbsp;// 2. 发起主动连接
&nbsp;&nbsp;&nbsp;&nbsp;err = syscall.Connect(socketFd, sa)
&nbsp;&nbsp;&nbsp;&nbsp;if err != nil &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;socket connect err: &quot;, err)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.Exit(-1)
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;var (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bufReader = bufio.NewReader(os.Stdin)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf = make([]byte, SIZE)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writen int
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readn int
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err2 error
&nbsp;&nbsp;&nbsp;&nbsp;)

&nbsp;&nbsp;&nbsp;&nbsp;for &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 3. 从标准输入读取数据
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line, _, err := bufReader.ReadLine()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if err != nil &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;bufReader.ReadLine err: &quot;, err)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf = line[:]

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 4. 向socket对端写入数据
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writen, err2 = syscall.Write(socketFd, buf)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if writen &gt; 0 &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readn, err2 =syscall.Read(socketFd, buf)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if readn &gt; 0 &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(&quot;read from socket: &quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Println(string(buf[:readn]))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if writen &lt;= 0 &amp;&amp; err2 != nil &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmt.Printf(&quot;socket write; writen:%d,&nbsp;&nbsp;err: %s&#92;n&quot;, writen, err2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;// 5. close socketFd
&nbsp;&nbsp;&nbsp;&nbsp;_ = syscall.Close(socketFd)
&#125;

</textarea><br/><br/>jackXiang@localhost  ~/golearning  ./echoClient<br/>jack<br/>read from socket:<br/>jack<br/>xiang<br/>read from socket:<br/>xiang<br/><br/>Q:果然Ok，两个问题探讨下：<br/>1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip4 := net.ParseIP(ADDR).To4()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sa := &amp;syscall.SockaddrInet4&#123;Port: PORT&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copy(sa.Addr[:], ip4)&nbsp;&nbsp;#这个sa.Addr[:] 冒号啥写法呢？<br/><br/>2）for &#123; 这里面是epoll 吗？&#125;<br/><br/>A:<br/>1. <br/>copy(sa.Addr[:], ip4)&nbsp;&nbsp;#这个sa.Addr[:] 冒号啥写法呢？<br/><br/>sa.Addr 是一个数组，<br/>sa.Addr[:] 将这个数组临时转为切片，底层数组指向sa.Addr数组<br/>方便copy进行切片复制<br/><br/>2. 就是个for&#123;&#125;死循环，防止代码往下执行<br/><br/>来自：<br/>https://mp.weixin.qq.com/s/dRADQ5kUCT80dX7oEAAXyA<br/>https://mp.weixin.qq.com/s/kFHw73w_IIqjKeicesCpZw
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践成功]go tcp tcpclient编码]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>