Python套接字 - 停止从UDP数据报中剥离回车符

0 投票
1 回答
2123 浏览
提问于 2025-04-17 08:40

我有一个用Python写的脚本,它读取一个ASCII文件(基本上是NMEA字符串),然后通过UDP发送这些数据,使用的是基本的socket库。

每秒钟会发送一段NMEA字符串,并且每段前面都有一个头部。服务器期望每段的开头是一个空行(具体来说是\r\n,也就是0d 0a)。我按照这个要求构建我的字符串('\r\n' + 段落内容)。在调试器中查看字符串的值,并把字符串转换成十六进制时,确实是以0d0a开头的。

但是,当我在Wireshark中查看十六进制转储时,发现0d这个字符似乎被去掉了,可能是socket库处理的时候把它去掉了,所以最终的数据包里只有0a。这样本来是没问题的,但服务器是硬编码的,期待的是0d0a。

那么,有没有办法强制socket库保留0d这个十六进制字符呢?在Windows和Linux下运行客户端时,情况都是一样的。

1 个回答

2

需要在你的原帖中添加一些实际的代码,这样我们才能了解可能出错的地方。

下面是一个关于Python 2.6的简单演示,这个版本没有自动处理换行的问题:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
>>> s.sendto('\r\nSOME TEXT HERE', ('127.0.0.1',9999))

然后在另一个终端中:

$ nc -ul 9999 | od -c
0000000   \r  \n   S   O   M   E       T   E   X   T       H   E   R   E

撰写回答