2015-03-13 137 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)