问题
我正在尝试使用Python附带的SocketServer,但是在握手阶段遇到了一些问题。只要我使用 localhost 或 127.0.0.1,握手就可以正常工作。但是,当我输入eth0卡的IP时,它就不会握手。我测试了这里找到的官方示例代码:
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
正如您在代码片段中看到的,尝试连接到10.2.293.26
我的网卡的 IP 不起作用。一旦我尝试连接到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
绑定到 localhost
,这不允许将计算机接口的 IP 地址指定为连接主机上的目标。
您应该在绑定操作(示例中的 HOST
参数)中指定0.0.0.0
或空字符串作为计算机的地址,以便允许远程主机将计算机的任何 IP 地址指定为目标。
有关localhost
、127.0.0.1
和 0.0.0.0
之间区别的更多信息,请参阅此答案或此答案。