我正在尝试使用Python附带的SocketServer,但我在握手阶段遇到了一些问题。只要我使用localhost或127.0.0.1,握手就可以正常工作。但是,当我把我的eth0卡的IP放入时,它就不会握手。我测试了官方示例代码found here:
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print "{} wrote:".format(self.client_address[0])
print self.data
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
终端代码段:
manos@box:~$ netcat 10.2.203.26 9999
manos@box:~$
manos@box:~$ netcat localhost 9999
test
正如您在代码段中看到的那样,尝试连接到我的网卡的IP 10.2.293.26
不起作用。一旦我尝试连接到localhost
,它就可以正常工作!
在Wireshark上,在第一个SYN从客户端发送到服务器之后(在初始握手阶段),我得到[RST, ACK]
。
我的第一个猜测是这是一个重置连接的路由器。但事实并非如此,因为我可以telnet
罚款:
1号航站楼:
manos@box:~/tmp/test$ netcat -l 9999
(waiting)
test
2号航站楼:
manos@box:~$ netcat 10.2.203.26 9999
test
答案 0 :(得分:3)
您绑定到localhost
,它不允许指定机器接口的IP地址/ es作为连接主机上的目标。
您应该在绑定操作中指定0.0.0.0
或空字符串作为计算机的地址(示例中为HOST
参数),以便允许远程主机指定任何计算机的IP地址作为目的地。
有关localhost
,127.0.0.1
和0.0.0.0
之间差异的详情,请参阅this answer或this one。