2015-03-13 127 views
0

我開始嘗試編寫一個Python TCP套接字監聽器。Python TCP套接字監聽器(Debian)

我有一個調制解調器連接到我的Debian框,每60秒報告一次GPS NMEA句子。現在我想要做的就是運行一個Python程序,它將接收並打印這些GPS消息。

調制解調器配置爲發送端口使用TCP的消息Debian的IP 8764

我創建了一個簡單的程序(基於http://pymotw.com/2/socket/tcp.html):

import socket 
import sys 

# Create a TCP/IP socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# Connect the socket to the port where the server is listening 
server_address = ('localhost', 8764) 
sock.connect(server_address) 

# Listen for incoming connections 
sock.listen(1) 

while True: 
    # Wait for a connection 
    print 'waiting for a connection' 
    connection, client_address = sock.accept() 

    try: 
     print 'connection from', client_address 

     while True: 
      data = connection.recv(8) 
      print 'received: %s' % data 

    except: 
     print 'error' 

當我運行這個腳本它只是坐在sock.accept(),在'等待連接'後

我不確定這是否是我的Python代碼中的問題, 。

運行netstat -tulpn我得到:

tcp 0 0 127.0.0.1:8764 0.0.0.0:* LISTEN 4327/python 

更新:

輸出sudo tcpdump -i any port 8764

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes 
12:51:27.953851 IP 192.168.0.1.3202 > myHostName.local.8764: Flags [S], seq 1679917557, win 5200, options [mss 1300,sackOK,TS val 5634364 ecr 0,nop,wscale 1], length 0 
12:51:27.953896 IP myHostName.local.8764 > 192.168.0.1.3202: Flags [R.], seq 0, ack 1679917558, win 0, length 0 
12:51:57.970515 IP 192.168.0.1.3203 > myHostName.local.8764: Flags [S], seq 1717423935, win 5200, options [mss 1300,sackOK,TS val 5664379 ecr 0,nop,wscale 1], length 0 
12:51:57.970561 IP myHostName.local.8764 > 192.168.0.1.3203: Flags [R.], seq 0, ack 1717423936, win 0, length 0 
12:52:08.981407 IP 192.168.0.1.3204 > myHostName.local.8764: Flags [S], seq 1728493476, win 5200, options [mss 1300,sackOK,TS val 5675389 ecr 0,nop,wscale 1], length 0 
12:52:08.981451 IP myHostName.local.8764 > 192.168.0.1.3204: Flags [R.], seq 0, ack 1728493477, win 0, length 0 
12:52:39.064132 IP 192.168.0.1.3626 > myHostName.local.8764: Flags [S], seq 1770515829, win 5200, options [mss 1300,sackOK,TS val 5705470 ecr 0,nop,wscale 1], length 0 
12:52:39.064175 IP myHostName.local.8764 > 192.168.0.1.3626: Flags [R.], seq 0, ack 1770515830, win 0, length 0 

192.168.0.1是GPS調制解調器的地址

因此,似乎每隔30秒就會發生一些握手。調制解調器不斷跳到新的端口,可能是因爲之前的通信嘗試失敗。


更新:

出於某種原因,我的服務器地址定義是問題。

server_address = ('192.168.0.4',8764)交換server_address = ('localhost',8764)解決問題

+0

你說的意思是什麼坐鎮在 ...'。它掛了還是什麼? – ForceBru 2015-03-13 16:36:38

+1

'tcpdump -i任何端口8764'是否顯示任何到達端口「8764」的數據包?這將是調試此問題的第一步。 – linuxfan 2015-03-13 16:36:49

+0

@ForceBru我的意思是打印後'等待連接'程序什麼都不做。我假設sock.accept()沒有返回。 – user3817250 2015-03-13 16:50:29

回答

2

我認爲,這是正常的行爲,因爲你的代碼監聽的連接。 connection, client_address = sock.accept()僅當您嘗試連接到您的腳本正在偵聽的端口時纔會被執行。您需要telnet localhost:9764才能使其正常工作。

我可能誤會了,但你從來沒有提到你嘗試連接到這個端口。

+0

我確實連接到這個端口。我會用tcpdump暫時更新我的​​問題。我的GPS調制解調器大約每60秒向該端口發送一次數據。 – user3817250 2015-03-13 18:18:15

0

的問題是,你明確地收聽回送設備(lo,對此IP 127.0.0.1又名localhost綁定)。

,如果你要綁定到所有設備(和你不關心的安全問題),使用空字符串作爲主機

server_address = ('', 8764)