go | 写一个c/s 服务器 采用utf-8编码 | 抓包简单分析

原来 go 实现 c/s是这么方便的啊

server.go

go 复制代码
package main

import (
        "bufio"
        "bytes"
        "fmt"
        "golang.org/x/text/encoding/unicode"
        "golang.org/x/text/transform"
        "io"
        "net"
        "os"
        "strings"
        "time"
)

func main() {

        addr, err := net.ResolveUDPAddr("udp", ":8080")
        if err != nil {
                panic(err)
        }

        conn, err := net.ListenUDP("udp", addr)

        if err != nil {
                panic(err)
        }
        defer conn.Close()

        buf := make([]byte, 1024)

        utf8Decoder := unicode.UTF8.NewDecoder()
        for {
                n, addr, err := conn.ReadFromUDP(buf)
                if err != nil {
                        fmt.Println("read error: ", err)
                        continue
                }

                decodedReader := transform.NewReader(bufio.NewReader(bytes.NewReader(buf[:n])), utf8Decoder)
                decodedBytes, _ := io.ReadAll(decodedReader)

                fmt.Printf("Received from [%s] and the message is\n%s\n", addr, string(decodedBytes))

                reader := bufio.NewReader(os.Stdin)
                fmt.Println("Enter message: ")
                response, _ := reader.ReadString('\n')

                response = time.Now().Format(time.RFC3339) + " " + response

                utf8Encoder := unicode.UTF8.NewEncoder()

                // 使用 UTF-8 编码器编码要发送的数据
                encodedReader := transform.NewReader(strings.NewReader(response), utf8Encoder)
                encodedBytes, _ := io.ReadAll(encodedReader)

                conn.WriteToUDP(encodedBytes, addr)
        }
}

client.go

go 复制代码
package main

import (
        "bufio"
        "bytes"
        "fmt"
        "golang.org/x/text/encoding/unicode"
        "golang.org/x/text/transform"
        "io"
        "net"
        "os"
        "strings"
        "time"
)

func main() {

        addr, err := net.ResolveUDPAddr("udp", "localhost:8080")

        if err != nil {
                panic(err)

        }

        conn, err := net.DialUDP("udp", nil, addr)
        if err != nil {
                panic(err)
        }
        defer conn.Close()

        reader := bufio.NewReader(os.Stdin)
        buf := make([]byte, 1024)
        for {

                fmt.Println("Enter message: ")
                message, _ := reader.ReadString('\n')

                message = time.Now().Format(time.RFC3339) + " " + message

                utf8Encoder := unicode.UTF8.NewEncoder()
                encodedReader := transform.NewReader(strings.NewReader(message), utf8Encoder)
                encodedBytes, _ := io.ReadAll(encodedReader)

                conn.Write(encodedBytes)

                n, _, err := conn.ReadFromUDP(buf)

                if err != nil {
                        fmt.Println("read err: ", err)
                        continue
                }

                utf8Encoder_ := unicode.UTF8.NewDecoder()

                decodedReader := transform.NewReader(bufio.NewReader(bytes.NewReader(buf[:n])), utf8Encoder_)
                decodedBytes, _ := io.ReadAll(decodedReader)

                fmt.Printf("Received from [%s] and the message is\n%s\n", addr, string(decodedBytes))
        }

}

抓包分析

tcpdump -vvv -n -i any -s0 port 8080 -w test.pcap

分析这个包

分析这个高也是可是很好的学习网络结构的

你会发现 linux cooked capture 这就是链路层

ip 协议就是网络层 20B 主要就是src 和 dst ip

这层协议就是找ip

接着是udp 传输数据。

udp 协议头8B

当两端确定好了(也就是找到src 和 dst)

就可以开始传输数据,这就是面向服务了,直接通过端口面向服务

这里有一个知识点,5分唯一性? 就是 src + src:port + 协议 + dst + dst:port

然后又可以扯远 timeout 、端口复用

相关推荐
ttwuai1 小时前
GoFrame 后台日志清空失败:无 WHERE 删除为什么被拦住
前端·golang
kaoa0002 小时前
Linux入门攻坚——84、网络虚拟化技术-1
linux·运维·服务器
RisunJan2 小时前
Linux命令-shutdown(安全关闭或重启系统)
linux·服务器·安全
进击的程序猿~2 小时前
Go 并发底层原理面试学习指南
开发语言·面试·golang
2601_965798473 小时前
MTDb Movie & TV Database Script Setup, Caching, and SEO Guide
linux·服务器·数据库·php
NoteStream3 小时前
【c语言基础】C语言常见概念
c语言·开发语言·编辑器
我头发多我先学3 小时前
linux系统编程:初识进程
linux·运维·服务器
Freak嵌入式3 小时前
版本混乱 / 依赖缺失?uPyPi:MicroPython 版 PyPI,彻底解决库管理混乱
linux·服务器·数据库·单片机·嵌入式硬件·性能优化·依赖倒置原则
云飞云共享云桌面3 小时前
SolidWorks—天津智能装备工厂1台高配主机共享给10个研发用
运维·服务器·自动化·汽车·制造
回眸不遇3 小时前
将 Docker虚拟磁盘文件ext.vhdx迁移出C盘 ,更换到D盘
c语言·docker·容器