Python套接字聊天问题

时间:2013-02-22 22:43:12

标签: python sockets inet-aton

我在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)认为对我来说很复杂,我想知道它是如何工作的.. 谢谢!

1 个答案:

答案 0 :(得分:0)

根据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中为您的应用程序选择未分配的多播地址并使用它(例如ad-hoc范围内的任何内容,如244.0.2.0)。请注意,多播地址与接口地址无关(使用“0.0.0.0”,您将所有本地接口与多播地址相关联,这意味着所有接口都可用于接收/发送该组的多播数据包。)