go hot update (1)

本文详细阐述了使用TCP协议监听并处理客户端连接的过程,包括获取连接类型、解析连接属性、进行反射操作以获取连接信息,并通过反射实现对连接属性的读取与修改,最终将处理结果写入文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package main

import (
	"net"
	"reflect"
	"fmt"
	"os"
)

func main() {

	listener, _ := net.Listen("tcp", ":8000")
	for {
		c , _ := listener.Accept()
		go connHandler(c)
	}
}

func connHandler(c net.Conn) {
	defer c.Close()
	e := reflect.TypeOf(c).Elem()
	n := e.NumField()
	for i := 0 ; i < n; i++ {
		fmt.Fprintf(os.Stdout, "e.Field(%d) = %v           %v\n", i, e.Field(i).Name, e.Field(i))
	}

	fmt.Fprintf(os.Stdout, "====================\n")

	v := reflect.ValueOf(c)
	fmt.Fprintf(os.Stdout, "reflect.ValueOf(c) %v\n", v)

	v = v.Elem()
	fmt.Fprintf(os.Stdout, "reflect.ValueOf(c).Elem() %v\n", v)
	fmt.Fprintf(os.Stdout, "====================\n")
	for i := 0; i < v.NumField(); i++ {
		fmt.Fprintf(os.Stdout, "v.Field(%d) = %v   %v\n", i, v.Field(i), v.Field(i).Type())
		switch v.Field(i).Type().Kind(){
		case reflect.Int:
			fmt.Fprintf(os.Stdout, "%d\n", v.Field(i).Int())
		}
	}
	fmt.Fprintf(os.Stdout, "====================\n")

	fmt.Fprintf(os.Stdout, "reflect.ValueOf(c).Elem().FieldByName(\"fd\") %v\n", v.FieldByName("fd"))
	fmt.Fprintf(os.Stdout, "reflect.ValueOf(c).Elem().FieldByName(\"fd\").Elem() %v\n", reflect.ValueOf(c).Elem().FieldByName("fd").Elem())
	v = reflect.ValueOf(c).Elem().FieldByName("fd").Elem()

	fmt.Fprintf(os.Stdout, "====================\n")
	for i := 0; i < v.NumField(); i++ {
		fmt.Fprintf(os.Stdout, "v.Field(%d) = %v   %v  %s\n", i, v.Field(i), v.Field(i).Type(), v.Field(i).String())
		switch v.Field(i).Type().Kind(){
		case reflect.Int:
			fmt.Fprintf(os.Stdout, "%d\n", v.Field(i).Int())
		}
	}
	fmt.Fprintf(os.Stdout, "====================\n")

	sysfd := v.FieldByName("sysfd")
	fmt.Fprintf(os.Stdout, "v.FieldByName(\"sysfd\") = %v\n", sysfd)

	fd := uintptr(sysfd.Int())
	fmt.Fprintf(os.Stdout, "fd %v\n", fd)


	f := os.NewFile(fd, "listen socket")
	fmt.Fprintf(os.Stdout, "f = %v\n", f)
	conn, err := net.FileConn(f)

	if err != nil {
		fmt.Fprintf(os.Stdout, "err %v\n", err.Error())
		return
	}
	fmt.Fprintf(os.Stdout, "c %v\n", conn)
	conn.Write([]byte("hello world ~!\n"))
}



[vicky@localhost ~]$ telnet 192.168.1.98 8000
Trying 192.168.1.98...
Connected to 192.168.1.98.
Escape character is '^]'.
hello world ~!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值