使用Python 2的套接字接口

时间:2018-03-24 16:51:14

标签: python python-2.7 sockets encryption

背景

我正在使用Python对聊天服务器应用程序进行编程,该应用程序对消息使用AES加密。当客户希望发送消息时,消息被加密,发送到中央服务器,然后广播给所有其他客户端。由于每个客户端在加入应用程序时都指定了密钥,因此使用此密钥(用于在发送消息之前加密消息的相同密钥)解密到客户端的所有传入消息。因此,使用相同密钥加入聊天室的任何两个客户端都可以安全地通信。由使用不同密钥加入的用户发送的消息将被不正确地解密,因此仍然看起来像胡言乱语。这部分有效!

问题:

我希望应用程序还显示用户发送的消息旁边的用户的IP地址。例如,像<user1_ip> hello there, user2!这样的东西。不幸的是,当我尝试使用send()recv()发送此数据时,我无法单独从邮件中发送IP地址信息。由于缓冲,两个字符串都作为一个连接字符串接收。这两个字符串都是可变长度的,我不能使用正则表达式将它们分开,因为我不知道消息将包含哪些数据。我已经尝试设置TCPNO_DELAY之类的套接字选项来将两者分开并快速查看docs,但没有可能的解决方案跳出来。必须有一些我想念或不知道的简单解决方案,我将非常感谢任何指导!

1 个答案:

答案 0 :(得分:1)

IP地址(我假设您正在处理IPv4)的最大长度为15个字符。如果您有类似192.128.1.1之类的内容,只需添加前面的零并将其转换为192.128.001.001 - 这样您就可以获得固定长度。您首先发送IP,然后发送消息。在接收方,你可以剥去那些零。

或者,添加一个单字节头,指定IP地址的长度。

另一种解决方案是在send()语句之间引入几秒的延迟,例如:

conn.send(ip_addr)
time.sleep(3)
conn.send(msg)

或者只是将IP地址作为前4个字节发送,除非您有理由将IP地址发送为字符串。