这标志着我们恶意软件开发之旅的开始。如果您是 Go 新手并且擅长 Go😅,或者对构建 TCP 服务器和客户端感到好奇,本指南将引导您逐步完成整个过程。我们将使用 Go 构建一个简单的 TCP 服务器,这是了解现代应用程序中网络的关键技能。
现在,让我们分解每个部分以准确了解发生了什么。
第 1 步:设置包和导入
package main
import (
"log"
"net"
)
Go 程序以 package 声明开始。由于这是一个可执行程序,因此我们使用 .接下来,我们导入两个基本包:,它提供用于将信息或错误输出到控制台的日志记录功能,以及 ,它包含用于创建和管理网络连接(客户端和服务器)的网络工具。package main
log
net
第 2 步:定义变量
var connection net.Conn
ip := "192.168.1.2"
port := "2001"
在这里,我们定义了几个基本变量:,它存储客户端连接到服务器后的 TCP 连接。该接口表示通用的面向流的网络连接。我们还将 and 定义为表示服务器本地 IP 地址和端口的字符串。在此示例中,我们使用 IP 和 port ,但您可以根据环境调整这些值。connection net.Conn
net.Conn
ip
port
192.168.1.2
2001
第 3 步:构建本地地址
localAddress := ip + ":" + port
在 Go 中,指定地址以 .在这里,我们使用运算符连接 和 变量以形成 ,它看起来像 。"ip:port"
ip
port
+
localAddress
192.168.1.2:2001
步骤 4:启动 TCP 侦听器
listener, err := net.Listen("tcp", localAddress)
if err != nil {
log.Fatal(err)
}
这是创建实际 TCP 侦听器的位置。该函数在指定的 IP 地址和端口上启动 TCP 侦听器。我们传递 “tcp” 来指定协议并指示在何处侦听传入连接。该函数返回一个接口,该接口存储在变量中,它允许我们接受传入连接。在 Go 中,错误处理至关重要。如果遇到问题,例如 IP/端口正在使用或无效,它将返回错误。将检查错误,并打印错误并退出程序。如果未发生错误,则服务器已准备好接受传入的 TCP 连接。net.Listen("tcp", localAddress)
localAddress
net.Listen
Listener
listener
net.Listen
if err != nil
log.Fatal(err)
步骤 5:接受传入连接 .
connection, err = listener.Accept()
if err != nil {
log.Println("Connection can't be Established")
} else {
log.Println("Connection Established Successfully from " + connection.RemoteAddr().String())
}
设置侦听器后,我们可以等待客户端连接。该函数会阻止 (等待) 客户端连接。建立连接后,它将返回一个表示与客户端的连接的对象,该对象存储在变量中。我们还会在此处检查错误;如果失败,例如由于网络问题,我们会记录无法建立连接。如果连接成功,我们将使用 记录客户端的 IP 地址。listener.Accept()
net.Conn
connection
Accept()
connection.RemoteAddr().String()
步骤 6:记录远程地址
log.Println("Connection Established Successfully from " + connection.RemoteAddr().String())
此行记录成功的连接并显示客户端的 IP 地址。该方法以 .这对于监控和调试目的非常有用,因为它可以让您查看谁连接到您的服务器。connection.RemoteAddr()
"ip:port"
这是我们的 TCP 服务器的完整代码:
#Server Side
package main
import (
"log"
"net"
)
func main() {
var connection net.Conn
ip := "192.168.1.2"
port := "2001"
localAddress := ip + ":" + port
listener , err :=net.Listen("tcp",localAddress)
if err != nil {
log.Fatal(err)
}
connection , err = listener.Accept()
if err != nil {
log.Println("Connection can't be Established")
}else {
log.Println("Connection Established Succ from" + connection.RemoteAddr().String())
}
}
下一个。。
客户端负责与我们的 TCP 服务器建立连接,使我们能够发送和接收消息。让我们尝试连接到我们的 TCP 服务器并演练不同的组件。
让我们开始吧!
步骤 1:导入所需的软件包
import (
"fmt"
"log"
"net"
)
在这里,我们导入新的 Go 包:
fmt
:提供格式化功能,用于将文本输出到控制台。
第 2 步:定义服务器地址
serverIp := "192.168.1.2"
serverPort := "2001"
serverAddress := serverIp + ":" + serverPort
serverIp and serverPort: These define the IP address and port number of
the server we’re trying to connect to. In this example, the server is
running on the local network at 192.168.1.2 on port 2001.
第 3 步:建立 TCP 连接
connection, err := net.Dial("tcp", serverAddress)
-
该函数用于连接到网络服务。在这种情况下,我们通过 TCP 协议 () 连接到指定的服务器地址 ()。如果连接成功,则返回一个对象,该对象表示已建立的连接,该对象存储在变量中。
net.Dial()
"tcp"
serverAddress
net.Dial
net.Conn
connection
错误处理:
if err != nil {
fmt.Println("Connection could not be established:", err)
return
}
如果 failed to connect to the server ,则返回错误 () 。使用 可确保程序在连接失败时提前退出,从而阻止进一步的代码执行。net.Dial()
err
return
第 4 步:记录成功消息
fmt.Println("Connection established to", connection.RemoteAddr().String())
建立连接后,将打印一条成功消息,显示服务器的远程地址。
第 5 步:关闭连接
defer connection.Close()
在 Go 中, 安排在周围函数(在本例中为 )返回时执行函数调用。通过使用 ,程序可确保在程序完成时正确关闭连接。defer
main()
defer connection.Close()
这有助于防止资源泄漏,确保操作系统知道该连接不再使用 .
下面是我们的 TCP 客户端的完整代码:
#Client Side
package main
import (
"fmt"
"log"
"net"
)
func main() {
serverIp := "192.168.1.2"
serverPort := "2001"
serverAddress := serverIp + ":" + serverPort
connection, err := net.Dial("tcp", serverAddress)
if err != nil {
fmt.Println("Connection could not be established:", err)
return
}
fmt.Println("Connection established to", connection.RemoteAddr().String())
defer connection.Close()
}
现在,我们将进行一些调整或改进,以添加从服务器端发送数据并在客户端接收数据的功能。
在服务器端,我们添加了以下代码,用于从控制台读取输入,并将消息发送到客户端:
#Server Side
reader := bufio.NewReader(os.Stdin)
fmt.Printf(">>> ")
dataToSend, err := reader.ReadString('n')
if err != nil {
log.Fatal(err)
}
我们创建一个新的 to read 来自控制台的输入。该行提示用户输入消息。该方法读取输入,直到遇到换行符,并将结果数据存储在变量中。bufio.Reader
fmt.Printf(">>> ")
reader.ReadString('n')
dataToSend
如果在此过程中发生错误,我们将记录错误并终止程序。
要将数据从服务器发送到客户端,我们使用以下代码:
numberBytes, err := connection.Write([]byte(dataToSend))
if err != nil {
log.Fatal(err)
}
fmt.Println("Number of Bytes Written is:", numberBytes)
在此代码中, 使用字节切片 调用,该字节切片将消息发送到客户端。该变量捕获操作期间写入的字节数。如果发生错误,我们将记录错误并终止程序。最后,我们打印成功写入的字节数,确认数据已发送。connection.Write()
dataToSend
numberBytes
现在,让我们在客户端实现相应的功能来接收和显示此消息。
#Client Side
reader := bufio.NewReader(connection)
dataReceived, err := reader.ReadString('n')
if err != nil {
log.Fatal(err)
}
data := strings.TrimSuffix(dataReceived, "n")
fmt.Println(data)
我们为已建立的读取传入数据创建一个。该方法等待来自服务器的数据,直到遇到换行符,并且接收到的数据存储在 中。如果在此过程中发生错误,我们将记录错误并终止程序。bufio.Reader
connection
reader.ReadString('n')
dataReceived
为了清理收到的消息,我们使用 remove 尾随换行符。最后,我们将收到的消息打印到控制台。strings.TrimSuffix(dataReceived, "n")
有了这个功能,我们在服务器和客户端之间建立了一个完整的通信通道!
总之,我们已经完成了使用 Golang 构建 TCP 服务器和客户端的第一次旅程。这个基础为我们未来的探索奠定了基础。在下一部分中,我们将更深入地探讨更高级的主题。
感谢您与我一起踏上这段旅程,请继续关注未来🥳更多激动人心的发展!
其它相关课程
详细目录
QT开发底层原理与安全逆向视频教程
linux文件系统存储与文件过滤安全开发视频教程(2024最新)
linux高级usb安全开发与源码分析视频教程
linux程序设计与安全开发
-
windows恶意软件开发与对抗视频教程
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
windows文件过滤(更新完成)
-
USB过滤(更新完成)
-
游戏安全(更新中)
-
ios逆向
-
windbg
-
还有很多免费教程(限学员)
rust语言全栈开发视频教程
-
更多详细内容添加作者微信
原文始发于微信公众号(安全狗的自我修养):Go :恶意软件开发(第一部分)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论