- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在 golang 中有一个设置,它基本上从操作系统获取一个空闲端口,然后在其上启动一个 http 服务器。它开始出现端口注册失败的随机错误。我将其简化为以下程序,在获取了几个空闲端口后似乎出错了。它非常随机地发生,并且没有真正的进程在它出错的端口上运行。为什么这必须出错对我来说根本没有意义。任何帮助将不胜感激。
程序输出:
..
..
58479
..
..
58867
58868
58869
..
绑定(bind)好! 58867
绑定(bind)好! 58868
绑定(bind)好! 58869
..
..
..
2015/04/28 09:05:09 绑定(bind)端口时出错:listen tcp :58479: bind: address already in use
我确保检查出来的自由端口从未重复。
package main
import (
"net"
"net/http"
"log"
"fmt"
)
func main() {
for {
l, _ := net.Listen("tcp", ":0")
var port = l.Addr().String()[5:]
l.Close()
fmt.Println(port)
go func() {
l1, err := net.Listen("tcp", ":"+port)
if (err != nil) {
log.Fatal("Error while binding port: ", err.Error())
} else {
fmt.Println("bound well! ", port)
}
http.Serve(l1, nil)
}()
}
}
最佳答案
你所做的是检查端口是否在某一时刻空闲,然后根据它过去空闲的事实尝试使用它。这是行不通的。
会发生什么:对于 for 循环的每次迭代,您都会生成一个端口号并确保它是空闲的。然后你生成一个例程以使用这个端口(它已经被释放回空闲端口池)。您真的不知道例程何时启动。它可能在主例程(for 循环)刚刚生成另一个空闲端口时被激活——也许又是同一个?或者也许另一个进程同时占用了这个端口。本质上,您可以在单个端口上设置竞争条件。
经过更多研究:
不过有一个小警告。只要本地+远程对是唯一的,两个不同的套接字就可以绑定(bind)到同一个 ip+端口。我曾经写过 response关于它。因此,当我使用 :0
创建监听器时,我能够得到一个“碰撞”; netstat -an
证明:
10.0.1.11.65245 *.* LISTEN
10.0.1.11.65245 17.143.164.101.5223 ESTABLISHED
现在,问题是如果你想显式地将套接字绑定(bind)到正在使用的端口,这是不可能的。可能是因为您只能指定本地地址,而在调用 listen 或 connect 之前不会知道远程地址(我们现在谈论的是系统调用,而不是 Go 接口(interface))。换句话说,当你不指定端口时,操作系统有更广泛的选择。因此,如果发生这种情况,您获得的本地地址也被另一个套接字使用,您将无法手动绑定(bind)到它。
如何解决:
正如我在评论中提到的,您的服务器进程应该使用 :0
符号,以便能够从操作系统中选择可用资源。一旦它开始监听,地址就应该被宣布给感兴趣的进程。例如,您可以通过文件或标准输出来完成。
关于tcp - 即使端口上没有任何运行,绑定(bind)地址已在使用中的 golang 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29924910/
我想知道两者都可以 UnicastRemoteObject.exportObject(Remote,portNo) & LocateRegistry.createRegistry(portNo); p
我有一个运行 tomcat 8.0.23 和 apache httpd 服务器的 vps。在 tomcat 中我有 3 个项目让我们用下面的名字来调用它们: /firstpro /secondpro
我试图将非 SSL 端口 8080 上的流量重定向到 SSL 端口 8443(在 Jboss 4.2.3.GA 版本上),但它不起作用。当我在此端口上访问我的 web 应用程序时,它会停留在该端口上并
跟进: Possible to query the native inbox of a mobile from J2ME? 我怎么知道Kannel将 SMS 发送到 native 收件箱端口(我想是端
我想用 python 开发一个代码,它将在本地主机中打开一个端口并将日志发送到该端口。日志只是 python 文件的命令输出。 喜欢: hello.py i = 0 while True:
我的 tomcat 在我的 linux 机器上独立运行在端口 7778 上。我已经将 apache 配置为在端口 443 上的 ssl 上运行。 我的 httpd.conf 如下: Liste
我正在使用 React Native 作为我想要部署到 iOS 和 Android 的头像生成器。我正在为我的服务器使用 Express,它使用 localhost:3000,react native
我正在使用主板(MSI Gaming主板)和两个支持NIC卡的e1000e驱动程序构建自定义操作系统。我想使用NIC卡中的端口而不是板载端口。 为了禁用板载端口,我尝试使用 70-persistanc
我目前使用的是xampp 1.7.0,我的php版本是5.2.8 我将我的 php.ini 文件更改为: [mail function] ; For Win32 only. SMTP = smtp.g
我有以下代码来配置 Jetty 服务器: @Configuration public class RedirectHttpToHttpsOnJetty2Config { @Bean p
我使用 Ubuntu 使用 Certbot 生成了一个 SSL。这已经自动更新了我的 Nginx 配置文件并添加了一个额外的监听端口。我担心我是否只需要监听一个端口(80 或 443)而不是两个端口,
我被困在一个点,我必须调用 pentaho API 来验证来自 reactJS 应用程序的用户。两者都在我的本地机器上。到目前为止我尝试过的事情: a) 在 reactJS 配置文件 - packag
我的 native 项目在 android 模拟器上运行 但是每当我尝试将我的项目与我的 android 设备连接时,就会出现上述错误。 注意:我的手机和笔记本电脑使用相同的 wifi 连接。 请帮我
我正在运行 Elasticsearch 服务器。除了 9200/9300 端口外,Elasticsearch 还开放了很多端口,如下所示。 elasticsearch-service-x64.exe
<portType> 元素是最重要的 WSDL 元素 <portType>可描述一个 web service、可被执行的操作,以及相关的消息 我们可以把 <portT
Stack Overflow 的其他地方有一个关于让 Icecast 出现在端口 80 上的问题,我已经阅读了该问题,但仍然无法让我的服务器在端口 80 上工作。 我的 icecast.xml 有这些
如果这是一个简单的问题,我很抱歉,我对这种事情不熟悉。 我正在尝试确定我的代理服务器 ip 和端口号,以便使用 google 日历同步程序。我使用谷歌浏览器下载了 proxy.pac 文件。最后一行是
我想知道 cassnadra 是否对所有 JMX 连接/节点间通信使用 7199 端口?与早期版本一样,7199 仅用于初始握手,但后来它使用随机选择 1024-65355 端口之间的任何端口。 谢谢
在docker hub中,有一个容器,该容器在启动时会默认打开9000端口。可以通过传递环境变量server__port来覆盖该端口。 我正在尝试在dockerfile中传递Heroku $ PORT
我已经在互联网上公开的虚拟机中安装了 docker。我已经在 VM 的 docker 容器中安装了 mongodb。Mongodb 正在监听 27017港口。 我已经使用以下步骤安装 docker
我是一名优秀的程序员,十分优秀!