2015-03-13 3 views
0

Я начинаю пытаться написать прослушиватель сокета TCP Python.Python TCP Socket Listener (Debian)

У меня есть модем, подключенный к моему блоку Debian, который сообщает о предложениях GPS NMEA каждые 60 секунд. Пока что все, что я хочу сделать, это запустить программу python, которая будет получать и печатать эти сообщения GPS.

Модем настроен для отправки сообщений на IP Debian, используя TCP на порт 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, или если я неправильно настроил TCP-сокет в Debian ,

Запуск netstat -tulpn я получаю:

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

Update:

Выход из 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 была проблема.

Обмен server_address = ('localhost',8764) с server_address = ('192.168.0.4',8764) решается вопрос

+0

Что вы имеете в виду под «сидит в ...'. Он висит или что? – ForceBru

+1

Открывает ли 'tcpdump -i любой порт 8764' пакеты, поступающие в порт' 8764'?Это было бы первым шагом в отладке этой проблемы. – linuxfan

+0

@ForceBru Я имею в виду, что после печати «ожидание соединения» программа ничего не делает. Я предполагаю, что sock.accept() не возвращается. – user3817250

ответ

2

Я думаю, это нормальное поведение, как ваш код слушает для соединений. connection, client_address = sock.accept() выполняется только при попытке подключения к порту, на котором прослушивается ваш скрипт. Вам нужно telnet localhost:9764, чтобы заставить его работать.

Возможно, я ошибся, но вы никогда не упоминаете, что пытаетесь подключиться к этому порту.

+0

Я действительно подключаюсь к этому порту. Я буду обновлять свой вопрос с помощью tcpdump на мгновение. Мой GPS-модем отправляет данные на этот порт примерно каждые 60 секунд. – user3817250

0

проблема в том, что вы явно прослушивает петлевой устройства (lo, к которому IP 127.0.0.1 ака localhost связан).

, если вы хотите связать с всех устройств (и вы не заботитесь о последствиях безопасности), используйте пустую строку в качестве хозяина:

server_address = ('', 8764)