2011-12-19 47 views
0

我有一個正在讀取ASCII文件(基本上是NMEA字符串)的Python腳本,然後使用基本套接字庫通過UDP廣播它們。Python套接字 - 停止從UDP數據報中剝離回車

NMEA字符串的'段落'每隔一秒鐘發出一個標題。服務器期望每個段落都以空行開頭(特別是\ r \ n,即0d 0a)。我適當地建立我的字符串('\ r \ n'+段落)。查看調試器中的字符串值並將該字符串轉換爲十六進制,它正確地預置了0d0a。

但是,當我檢查Wireshark中的十六進制轉儲時,似乎0d被剝離出來,大概是由套接字庫引起的,所以最終的數據報只有0a。當然,這應該是好的,除了服務器硬編碼爲0d0a。

那麼,有什麼辦法強制套接字庫保持0D十六進制字符?當我在Windows和Linux下運行客戶端時發生同樣的事情。

+0

很奇怪的事情,通常是 「\ n」 被轉換到通過套接字/串行端口進行通信時「\ r \ n」.. .. – redShadow 2011-12-19 23:35:56

+0

您究竟使用什麼來發送數據?你能顯示幾行代碼嗎?套接字庫本身是8位清理的,不會改變位,但是您可能正在使用中間流或類似文件的對象,它正在進行通用換行解釋。 – 2011-12-19 23:36:33

+0

例如,你是否使用'socket.makefile()'而不使用模式''wb''? – 2011-12-19 23:40:51

回答

2

需要編輯您原來的職位與實際代碼所以我們可以得到什麼可能會錯誤的句柄。

這是關於Python 2.6的簡短演示不具備魔法換行符改寫(munging):

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