【问题标题】:Python UDP and TCP communication between VMware host and guest not workingVMware主机和来宾之间的Python UDP和TCP通信不起作用
【发布时间】:2016-01-11 15:22:09
【问题描述】:

我正在使用带有 Windows 7 主机和 Ubuntu 来宾的 VMWare 工作站。我正在尝试使用 UDP 或 TCP 在两者之间进行通信——两者都没有成功。我将我的虚拟机设置为桥接网络模式,它为其提供了自己的 IP 地址。我有来自任何在线示例站点的最基本的 TCP/UDP 服务器和客户端代码,如果我在主机上运行它们,我已经测试过并且工作正常。但是,当我在 VM 上有客户端或服务器时,通信不会通过。

为了弄清楚发生了什么,我在主机上运行了 UDP 服务器,并在主机上运行了 Wireshark,并将其过滤为 UDP;然后我尝试从客户机上的客户端发送一个数据包,在wireshark中我可以看到数据包正在通过,但服务器似乎不想接收它。有什么想法吗?

UDP 服务器:

import socket
import sys

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Bind the socket to the port
server_address = ('0.0.0.0', 10000)
print >>sys.stderr, 'starting up on %s port %s' % server_address
sock.bind(server_address)

while True:
    print >>sys.stderr, '\nwaiting to receive message'
    data, address = sock.recvfrom(4096)

    print >>sys.stderr, 'received %s bytes from %s' % (len(data), address)
    print >>sys.stderr, data

    if data:
        sent = sock.sendto(data, address)
        print >>sys.stderr, 'sent %s bytes back to %s' % (sent, address)

UDP 客户端:

import socket
import sys

# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

server_address = ('192.168.100.38', 10000)
message = 'This is the message.  It will be repeated.'

try:

    # Send data
    print >>sys.stderr, 'sending "%s"' % message
    sent = sock.sendto(message, server_address)

    # Receive response
    print >>sys.stderr, 'waiting to receive'
    data, server = sock.recvfrom(4096)
    print >>sys.stderr, 'received "%s"' % data

finally:
    print >>sys.stderr, 'closing socket'
    sock.close()

在wireshark中我可以看到VM客户端发送的数据包:

Src=192.168.100.42 Dst=192.168.100.38 Proto=UDP

【问题讨论】:

  • 看看这个:server_address = ('127.0.0.1', 10000) 它不应该是那样的。要么 A. 让 nginx 将该端口转发出去,要么 B. 将 127.0.0.1 更改为 0.0.0.0,如果这不起作用,那么你做错了。

标签: python sockets udp virtual-machine


【解决方案1】:
server_address = ('127.0.0.1', 10000)
print >>sys.stderr, 'starting up on %s port %s' % server_address
sock.bind(server_address)

您告诉套接字侦听发往 127.0.0.1:10000 的数据包,但传入的数据包发往 192.168.100.37:10000。试试

bind(('0.0.0.0', 10000)

【讨论】:

  • 领先你30秒! :P你仍然得到一个赞成票:P
  • 谢谢,但是当客户端在虚拟机上时它仍然不起作用。
  • 您是否将服务器更改为绑定(0.0.0.0, 10000)?因为如果您只更改了从客户端运行它,您仍然会将包发送到 192.168.100.37,而不是 127.0.0.1
  • 是的。我更新了代码。刚刚使用帖子中的确切代码进行了测试,当服务器和客户端都在主机上时它可以工作。但不适用于 VM 上的客户端。
  • hmm wierd,尝试了以下方式 ubuntu(host)->ubuntu(host) ubuntu(host)->centos(guest) centos(guest)->centos(guest)
猜你喜欢
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
相关资源
最近更新 更多