-
-
Notifications
You must be signed in to change notification settings - Fork 14.8k
Closed as not planned
Labels
Description
Bug Description
frp在收到客户端FIN后会好像直接回复[FIN ACK], 从而导致后续数据包服务端无法正常发送给客户端。这里给出一个客户端和服务端的示例代码,如果在本地连接则正常,如果通过FRP转发则异常
frpc Version
0.62.0
frps Version
0.62.0
System Architecture
frps:linux/amd64; frpc:windows/amd64
Configurations
服务端代码:
package main
import (
"fmt"
"net"
)
func main() {
listener, err := net.Listen("tcp", "127.0.0.1:21000")
if err != nil {
fmt.Println("Error listening:", err.Error())
return
}
defer listener.Close()
fmt.Println("Server listening on :21000")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting:", err.Error())
continue
}
go handleRequest(conn)
}
}
func handleRequest(conn net.Conn) {
defer conn.Close()
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
data := string(buf[:n])
fmt.Printf("Received from client: %s\n", data)
_, err = conn.Write([]byte("Server received: " + data))
if err != nil {
fmt.Println("Error writing:", err.Error())
}
}客户端代码:
package main
import (
"fmt"
"net"
)
func main() {
// conn, err := net.Dial("tcp", "127.0.0.1:21000")
conn, err := net.Dial("tcp", "server:21666")
if err != nil {
fmt.Println("Error connecting:", err.Error())
return
}
defer conn.Close()
message := "hello"
_, err = conn.Write([]byte(message))
if err != nil {
fmt.Println("Error sending:", err.Error())
return
}
// Close write side to signal we're done sending
tcpConn := conn.(*net.TCPConn)
tcpConn.CloseWrite()
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("Error receiving:", err.Error())
return
}
fmt.Printf("Server response: %s\n", string(buf[:n]))
}Logs
Steps to reproduce
TCP客户端在发送数据后立即关闭写入, 例如:
tcpConn := conn.(*net.TCPConn)
tcpConn.CloseWrite()Affected area
- Docs
- Installation
- Performance and Scalability
- Security
- User Experience
- Test and Release
- Developer Infrastructure
- Client Plugin
- Server Plugin
- Extensions
- Others


