Golang中net.Listen TCP绑定错误:请求的地址在上下文中无效

Golang中net.Listen TCP绑定错误:请求的地址在上下文中无效 我正在尝试创建一个监听器,但在启动监听器时遇到错误:

监听 tcp 192.168.200.75:49156: bind: 请求的地址在其上下文中无效。

我的代码:

func main(){
ln, err := net.Listen("tcp", "192.168.200.75:49156")
if err != nil {
fmt.Println("Erro1:", err) // handle error
return
}
for {
_, err := ln.Accept()
if err != nil {
fmt.Println("Erro2:", err)
}
}
}

我知道这个IP地址是正确的,因为如果我使用net.Dial可以成功连接。

有人能帮我追踪一下问题所在吗?

谢谢


更多关于Golang中net.Listen TCP绑定错误:请求的地址在上下文中无效的实战教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

那么你需要监听计算机上可用的地址,并告诉设备将事件发送到你的计算机。

更多关于Golang中net.Listen TCP绑定错误:请求的地址在上下文中无效的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不。它只是监听机器上的所有接口,而不仅仅是你之前使用的那个IP地址。

人员计数器是一种用于统计通过某个区域人数的设备,当检测到新的通过时,该设备会向端口发送TCP消息。

我的程序正在计算机上运行,需要监听设备端口上的事件。

谢谢

是的,我确定。该IP地址是人员计数设备的地址。

如果我尝试使用 net.Dial("tcp", "192.168.200.75"),它可以正常工作…

谢谢

我是Go编程的新手(大约两周),但有一些使用其他语言进行套接字编程的经验。我同意NobbZ的观点,看起来您正在尝试绑定到未分配给设备的IP地址。

net.Dial 成功仅意味着网络中能够看到具有该IP地址的某个设备,但这并不表示该地址已绑定到您计算机的任何接口上。

编辑

我不确定您所说的"人员计数设备"具体指什么。您是在该设备上运行程序吗?

func main() {
    fmt.Println("hello world")
}

如果我调用

net.Listen("tcp",":49156") 

程序运行正常,但我没有收到来自服务器的任何消息。如果我使用 net.Listen(“tcp”,":49156") 调用,会监听我网络中所有 49159 端口吗?

谢谢

你确定你使用的IP地址属于你启动程序的那台计算机吗?

你显示的错误信息通常明确表示:没有可见的接口分配了该IP地址。

如果你使用的是Linux系统,可以使用 ip addr 命令列出所有接口及其IP地址。如果你的IP不在该列表中,就需要选择另一个IP地址。

func main() {
    fmt.Println("hello world")
}

能否按照以下说明发布代码:如何在本论坛发布代码,这样会更便于阅读。

由于for循环永远不会退出,waitForExitSignal()将永远不会被调用。但这并非您的问题所在。请尝试使用以下代码让服务器监听所有接口:

net.Listen("tcp", ":49156")

amandio.6:

net.Listen(“tcp”, “192.168.200.75:49156”)

你好。这个IP地址是你要运行脚本的服务器上的吗?或者可能是第二次运行程序时端口尚未释放?请关闭由Accept()返回的连接。

net.Listen("tcp", "192.168.200.75:49156")

是的,IP地址在服务器上。

这是我的全部代码:

package main

import (
	"fmt"
	"net"
	"os"
	"os/signal"
	"syscall"
)

func main() {
	ln, err := net.Listen("tcp", "192.168.200.75:49156")
	if err != nil {
		fmt.Println("Erro1:", err) // handle error
		return
	}
	for {
		conn, err := ln.Accept()
		if err != nil {
			fmt.Println("Erro2:", err)
		}
		go handleConnection(conn)
	}

	waitForExitSignal()
}

func waitForExitSignal() {
	sigchan := make(chan os.Signal, 10)
	signal.Notify(sigchan, syscall.SIGTERM, os.Interrupt)
	<-sigchan
}

func handleConnection(conn net.Conn) {
	fmt.Println("Handling new connection...")

	// Close connection when this function ends
	defer func() {
		fmt.Println("Closing connection...")
		conn.Close()
	}()
}

程序在net.Listen处停止了。

谢谢

这个错误通常表示系统无法在指定的IP地址和端口上绑定监听器。以下是几个可能的原因和解决方案:

1. IP地址不在本地网络接口上 检查192.168.200.75是否确实是当前主机的有效IP地址:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 检查本地网络接口
    interfaces, err := net.Interfaces()
    if err != nil {
        fmt.Println("Error getting interfaces:", err)
        return
    }
    
    for _, iface := range interfaces {
        addrs, err := iface.Addrs()
        if err != nil {
            continue
        }
        for _, addr := range addrs {
            fmt.Printf("Interface: %s, Address: %s\n", iface.Name, addr.String())
        }
    }
}

2. 端口已被占用 检查端口49156是否已被其他进程占用:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 尝试连接检查端口是否被占用
    conn, err := net.Dial("tcp", "192.168.200.75:49156")
    if err == nil {
        conn.Close()
        fmt.Println("Port 49156 is already in use")
        return
    }
    fmt.Println("Port 49156 is available")
}

3. 使用通配符地址 尝试使用通配符地址来绑定所有接口:

package main

import (
    "fmt"
    "net"
)

func main() {
    // 绑定所有接口
    ln, err := net.Listen("tcp", ":49156")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer ln.Close()
    
    fmt.Println("Listening on port 49156")
    
    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println("Accept error:", err)
            continue
        }
        go handleConnection(conn)
    }
}

func handleConnection(conn net.Conn) {
    defer conn.Close()
    // 处理连接
}

4. 绑定到localhost 如果只需要本地访问,使用localhost:

package main

import (
    "fmt"
    "net"
)

func main() {
    ln, err := net.Listen("tcp", "127.0.0.1:49156")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer ln.Close()
    
    fmt.Println("Listening on localhost:49156")
    
    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println("Accept error:", err)
            continue
        }
        go handleConnection(conn)
    }
}

5. 检查防火墙和权限 在Windows上,可能需要管理员权限绑定某些端口。在Linux上,检查防火墙设置:

package main

import (
    "fmt"
    "net"
    "syscall"
)

func main() {
    // 检查是否有权限绑定端口
    ln, err := net.Listen("tcp", ":49156")
    if err != nil {
        if opErr, ok := err.(*net.OpError); ok {
            if syscallErr, ok := opErr.Err.(*syscall.Errno); ok {
                if *syscallErr == syscall.EACCES {
                    fmt.Println("Permission denied - try running as administrator/root")
                    return
                }
            }
        }
        fmt.Println("Error:", err)
        return
    }
    defer ln.Close()
    
    fmt.Println("Successfully bound to port 49156")
}

最常见的问题是IP地址不在本地网络接口上或者端口已被占用。建议先运行网络接口检查代码确认IP地址的有效性。

回到顶部