我正在尝试从mac终端设置一个带python的服务器.
我导航到文件夹位置使用:
python -m SimpleHTTPServer
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:
socket.error: [Errno 48] Address already in use
Run Code Online (Sandbox Code Playgroud)
我以前使用相同的命令为我机器中不同位置的不同网站打开连接.
我试图将套接字绑定到下面的端口:
if( bind(socket_desc,(struct sockaddr *) &server, sizeof(server)) < 0)
{
perror("bind failed. Error");
return 1;
}
puts("bind done");
Run Code Online (Sandbox Code Playgroud)
但它给出了:
$ ./serve
Socket created
bind failed. Error: Address already in use
Run Code Online (Sandbox Code Playgroud)
为什么会出现此错误?
我没有看到任何重要的TCP/IP服务器不使用SO_REUSEADDR:
是否有任何用例在TCP/IP服务器上不使用SO_REUSEADDR?
我的意思是,是否会让操作系统始终使用SO_REUSEADDR来破坏任何不使用它的服务器?
你知道一个不使用SO_REUSEADDR的TCP/IP服务器吗?
(当然你可能不想在MSWindows上使用它,因为它允许在同一个端口上运行两个服务器)
我在golang中有一个设置,它基本上从操作系统获得一个自由端口,然后在它上面启动一个http服务器.它开始出现端口注册失败的随机错误.我把它简化为以下程序,在抓住一些空闲端口后似乎出错了.它发生得非常随机,并且没有真正的进程在端口上运行它出错.对我来说,为什么这有误差是没有意义的.任何帮助,将不胜感激.
计划的输出:
..
..
58479
..
..
58867
58868
58869
..
必然好!58867
很好!58868
很好!58869
..
..
..
2015年4月28日9时05分09秒出错绑定端口:已使用的地址:听TCP:58479:绑定
我确保检查出来的自由端口从未重复过.
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)
}()
}
}
Run Code Online (Sandbox Code Playgroud)