【问题标题】:Python socket chat problemsPython 套接字聊天问题
【发布时间】:2013-02-22 22:43:12
【问题描述】:

我在 Python 中找到了一个聊天应用程序的代码,但我找不到任何关于作者或网站上任何人的信息来帮助我。

这是整个代码的链接: http://files.myopera.com/manojsheokand666/blog/chat.py

我感觉缺少了一些东西。我需要这个,我想修改它并尝试学习更多东西

我做了一些阅读,这是我第三次编辑这篇文章.. 现在,我可以保持连接而不会出现任何错误,但是当我尝试发送(输入)某些东西时,它既不发送也不接收。但是,每当我尝试以另一个“人”的身份运行第二个应用程序时,我都会在第一个正在运行的应用程序上收到“人”已连接的消息,并且第一个应用程序会因以下错误而崩溃:

KeyError: ('127.0.0.1',62833) - 注意,端口总是不同的

虽然,第二个应用程序仍然存在,但如果我再次运行该应用程序,它不会收到任何内容或崩溃。

我做了什么:

host = gethostbyname(gethostname()) #this actually gets 192.168.0.101 (my local IP to the router)
s.setsockopt(SOL_IP,IP_ADD_MEMBERSHIP,\
            inet_aton(addr)+inet_aton(host)) #i write 225.0.0.1 as 'addr'

还有其他方法可以让它工作吗?我可以使用 telnet 运行一个简单的服务器/聊天,但是这个 GUI(tkinter)认为这对我来说很复杂,我想了解它是如何工作的.. 谢谢!

【问题讨论】:

  • 查看msdn.microsoft.com/en-gb/library/windows/desktop/… 并向下滚动到错误 10049。这应该可以解释错误
  • 我明白了.. 但是如果我试图绑定到 0.0.0.0 是不是应该像那样工作?好像我在说它可以绑定到任何地方?
  • 如果您包含更多代码,对人们回答会更有帮助。我看不出你的 sn-p 代码有什么问题。
  • 代码没有问题,只是不是多播地址 - 请参阅答案。

标签: python sockets inet-aton


【解决方案1】:

从IP_ADD_MEMBERSHIP选项的定义来看,第一个地址是组播组地址,第二个是接口地址。

您使用 127.0.0.1 作为第一个地址。这不是多播地址。

多播地址在 224.0.0.0/4 范围内(即 224.0.0.1 到 239.255.255.254,不包括网络和广播地址)。

例如,使用第一个(同一网段上的所有主机)多播地址就可以了:

>>> s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
>>> s.setsockopt(socket.SOL_IP,socket.IP_ADD_MEMBERSHIP,
                 socket.inet_aton('224.0.0.1')+socket.inet_aton('0.0.0.0'))

查看reference 了解有关多播地址的更多信息。

因此,您需要在 224/4 中为您的应用程序选择一个未分配的多播地址并使用它(例如,临时范围内的任何内容,如 244.0.2.0)。请注意,多播地址与接口地址无关(使用“0.0.0.0”,您将所有本地接口与多播地址相关联,这意味着所有接口都可用于接收/发送该组的多播数据包)。

【讨论】:

  • 这解释了很多!谢谢.. 但是,我仍然遇到问题(我开始认为代码中有其他问题,或者我无法理解它的“工作方式”)在原始帖子中添加了更多代码我>
  • 我编辑只是知道.. 是的,感谢您指出这一点。你的回答也被接受了!
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
相关资源
最近更新 更多