2011-10-02 24 views
1

我通过Python在网络上发送加密音频。这个应用程序暂时工作,然后打破说它必须是16的倍数。“消息必须是16的倍数”使用Python通过网络加密音频

不知道我做错了什么。或者在代码中寻找解决方法。

我会很感激你必须提供

编辑*我相信我有,现在如果有人有兴趣考虑看看我做了一个谷歌代码项目

http://code.google.com/p/mii-chat/

+1

看起来像ed。可能是正确的,但在未来总是发布完整的追溯。 – agf

回答

1

我做了一个代码的快速扫描。所有消息都是在加密后发送的,所以您发送的总数据是16的倍数,再加上1的命令。到现在为止还挺好。

在解密端,您将剥离命令,这会给您留下一个再次为16的倍数的消息。但是,在致电decrypt_my_message之前,您正在致电msg.strip()。对strip的调用可能会通过从开始或结束中删除字节来破坏您的加密数据。

我会进一步检查代码,并编辑此答案,如果我找到其他任何东西。


编辑:

您正在使用空格字符进行填充,我想你的意思是使用strip调用去除填充。您应该将decrypt_my_message(msg.strip())更改为decrypt_my_message(msg).strip()


您正在使用TCP发送数据,因此您的协议必然会让您长期头痛。我总是使用这种自定义协议在我的消息中发送有效负载的长度,因此接收端可以确定它是否正确接收了消息块。例如,您可以使用:CMD|LEN(2)|PAYLOAD(LEN)作为您的数据框。这意味着,一个字节的命令,另外两个字节告诉服务器有多少字节的预期,以及实际消息的字节数。这样,你的recv调用可以循环,直到它读取正确的数额。更重要的是,它们不会在连接/发送时读取下一个数据包。

另外,如果你的数据包足够小,你可以去UDP。它打开了另一个蠕虫罐,但你知道recv将只收到一个UDP包。

+0

如果您收到2024字节并截断第一个2023字节。这是16的倍数? – agf

+0

您收不到超过您发送的数量。我正要深入研究代码的网络传输部分。就目前来看,它将在所有消息中的约1.5%中断。 – vhallac

+0

对不起,我的代码对你不好?无论如何,我感谢您的帮助,谢谢我将继续通过这个插件。 :-) – ADE

3
msg = conn.recv(2024) 
if msg:     
    cmd, msg = ord(msg[0]),msg[1:] 
    if cmd == CMD_MSG: 
     listb1.insert(END, decrypt_my_message(msg.strip()) + "\n") 
工作的任何帮助

代码中的上面代码片段读取了2024个字节的数据(不是16的倍数),然后(如果“if”语句为True),则以msg.strip()作为参数调用decrypt_my_message。然后decrypt_my_message抱怨说,它给了一个字符串,其长度不是16的倍数(我猜这是问题所在。查看回溯以查看这是否是导致异常的行)。

您需要使用长度为n * 16的字符串调用decrypt_my_message。

您可能需要重新思考读取流的逻辑 - 或者在中间有一些东西来缓存对decrypt_my_message的调用,使其成为n * 16的块。

相关问题