admin 管理员组

文章数量: 1184232

大家好,我是码农先森。

前言

各种编程语言百花齐放、百家争鸣,但是 “万变不离其中”。对于网络通信而言,每一种编程语言的实现方式都不一样;但其实,调用的底层逻辑都是一样的。linux 系统底层向上提供了统一的 Socket 通信系统函数,动态链接库 /lib64/libc.so 中就是实现网络通信的关键类库。下面我们会以 Go 语言为例,来分析网络通信数据传输的路径;最终揭开各大编程语言网络通信的神秘面纱。

演示程序

1、使用 Go 编写一个简单的 Socket 程序

package main
import (
    "fmt"
    "net"
)
func main() {
    // 监听本地端口
    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error listening:", err.Error())
        return
    }
    defer listener.Close()
    fmt.Println("Listening on localhost:8080")
    for {
        // 接收客户端连接
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting:", err.Error())
            return
        }
        // 处理客户端请求
        go handleRequest(conn)
    }
}
func handleRequest(conn net.Conn) {
    // 读取请求数据
    buffer := make([]byte, 1024)
    n, err := conn.Read(buffer)
    if err != nil {
        fmt.Println("Error reading:", err.Error())
        return
    }
    // 处理请求数据
    message := string(buffer[:n])
    fmt.Println("Received message:", message)
    // 发送响应数据
    reply := "Hello, client!"
    conn.Write([]byte(reply))
    // 关闭连接
    conn.Close()
}

2、编译成二进制文件。

go build main.go

[yxh@dev01 demo]$ ls -l
total 2536
-rwxr-xr-x 1 yangxionghai devops 2590837 Jun  2 15:42 main
-rw-r--r-- 1 yangxionghai devops    1023 Jun  2 15:39 main.go

3、执行 main 二进制文件

[yxh@dev01 demo]$ ./main 
Listening on localhost:8080

跟踪进程数据

1、跟踪 main 进程

# 找到进程ID
[yxh@dev01 demo]$ ps -aux | grep main
yxh+ 32270  0.0  0.0 816460  1732 pts/3    Sl+  16:47   0:00 ./main
yxh+ 32404  0.0  0.0 112816   968 pts/13   S+   16:47   0:00 grep --color=auto main

2、使用 strace 跟踪进程

strace -f -s 2048 -i -T -o trace.log -p 32270
命令各参数的解释:
-f: 跟踪在运行时从父进程派生出来的子进程,包括进程创建和退出等操作。
-s: 指定在输出中显示的字符串的最大长度为 2048 字节,这样可以避免过长的输出导致日志文件过大。
-i: 在输出中同时显示系统调用的入口和返回地址。
-T: 在输出中显示每个系统调用花费的时间。
-o: 将输出的结果写入到名为 trace.log 的文件中,而不是输出到控制台。
-p: 指定要跟踪的进程 ID 是 32270。

3、使用 telnet 发生数据

# 客户端发送数据
[yxh@dev01 ~]$ telnet 127.0.0.1 8080
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
^]
telnet> 
# 客户端发生的数据
hello world
# 服务端返回的数据
Hello, client!
Connection closed by foreign host.

4、服务端接收到数据

# 服务端接收到数据
[yxh@dev01 demo]$ ./main 
Listening on localhost:8080
Received message:

本文标签: 数据 系统 编程