Fix: fuck udp

This commit is contained in:
2025-10-16 08:09:19 +08:00
parent 0dea850cfa
commit e7d0f4235f
4 changed files with 29 additions and 58 deletions

1
cmd.go
View File

@@ -26,5 +26,4 @@ func init() {
RootCmd.AddCommand(authCmd)
RootCmd.AddCommand(playerCmd)
RootCmd.AddCommand(testCmd)
}

View File

@@ -116,12 +116,7 @@ type clientScanMsg time.Time
func (m *LobbyModel) clientScan() tea.Cmd {
return tea.Tick(REFRESH_TIME, func(t time.Time) tea.Msg {
m.endpoints = []string{}
for _, endpoint := range viper.GetStringSlice("udp-endpoints") {
if err := utils.Ping(endpoint); err == nil {
m.endpoints = append(m.endpoints, endpoint)
}
}
m.endpoints, m.err = utils.Ping(viper.GetStringSlice("udp-endpoints"))
return clientScanMsg(t)
})
}

38
test.go
View File

@@ -1,38 +0,0 @@
package main
import (
"gitea.konchin.com/ytshih/inp2025/utils"
"github.com/spf13/cobra"
)
var testCmd = &cobra.Command{
Use: "test",
}
var testServerCmd = &cobra.Command{
Use: "server",
Run: func(cmd *cobra.Command, args []string) {
dataCh := make(chan string)
_, shutdown, err := utils.ListenUDPData(18787, dataCh)
if err != nil {
panic(err)
}
defer shutdown()
<-dataCh
},
}
var testClientCmd = &cobra.Command{
Use: "client",
Run: func(cmd *cobra.Command, args []string) {
err := utils.Ping("localhost:18787")
if err != nil {
panic(err)
}
},
}
func init() {
testCmd.AddCommand(testServerCmd)
testCmd.AddCommand(testClientCmd)
}

View File

@@ -3,6 +3,7 @@ package utils
import (
"fmt"
"net"
"time"
"gitea.konchin.com/ytshih/inp2025/types"
"github.com/vmihailenco/msgpack/v5"
@@ -11,6 +12,8 @@ import (
const (
BUFFER_SIZE int = 1024
MAGIC_NUMBER int = 114514
LISTEN_TIMEOUT = 200 * time.Millisecond
)
type UDPReqType int
@@ -36,24 +39,36 @@ func ListenUDPData(
return ListenUDP(port, dataCh, nil)
}
func Ping(endpoint string) error {
func Ping(endpoints []string) ([]string, error) {
pingCh := make(chan string)
local, shutdown, err := ListenUDP(0, nil, pingCh)
if err != nil {
return err
return []string{}, err
}
defer shutdown()
err = SendRawPayload(endpoint, UDPPayload{
MagicNumber: MAGIC_NUMBER,
Endpoint: local,
Type: UDPReqTypePingRequest,
})
if err != nil {
return err
for _, endpoint := range endpoints {
SendRawPayload(endpoint, UDPPayload{
MagicNumber: MAGIC_NUMBER,
Endpoint: local,
Type: UDPReqTypePingRequest,
})
}
doneCh := make(chan struct{})
go func() {
time.Sleep(LISTEN_TIMEOUT)
doneCh <- struct{}{}
}()
ret := []string{}
for {
select {
case <-doneCh:
return ret, nil
case endpoint := <-pingCh:
ret = append(ret, endpoint)
}
}
<-pingCh
return nil
}
func ListenUDP(
@@ -61,7 +76,7 @@ func ListenUDP(
dataCh chan string,
pingCh chan string,
) (string, types.ShutdownFunc, error) {
conn, err := net.ListenUDP("udp", &net.UDPAddr{Port: port})
conn, err := net.ListenUDP("udp4", &net.UDPAddr{Port: port})
if err != nil {
return "", nil, fmt.Errorf("failed to listen udp, %w", err)
}
@@ -123,7 +138,7 @@ func SendRawPayload(
endpoint string,
payload UDPPayload,
) error {
conn, err := net.Dial("udp", endpoint)
conn, err := net.Dial("udp4", endpoint)
if err != nil {
return fmt.Errorf("failed to dial endpoint, %w", err)
}