【问题标题】:Python TCP Socket Listener (Debian)Python TCP 套接字侦听器(Debian)
【发布时间】:2015-03-13 16:31:24
【问题描述】:

我开始尝试编写 Python TCP 套接字侦听器。

我有一个调制解调器连接到我的 Debian 盒子,它每 60 秒报告一次 GPS NMEA 语句。现在我想做的就是运行一个 python 程序来接收和打印这些 GPS 信息。

调制解调器配置为使用 TCP 端口 8764 将消息发送到 Debian IP。

我创建了一个简单的程序(基于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 代码中的问题,或者我没有在 Debian 中正确配置 TCP 套接字。

运行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 定义出了问题。

server_address = ('192.168.0.4',8764) 交换server_address = ('localhost',8764) 解决了这个问题

【问题讨论】:

  • “坐在……”是什么意思。是挂了还是怎么了?
  • tcpdump -i any port 8764 是否显示到达端口8764 的任何数据包?这将是调试此问题的第一步。
  • @ForceBru 我的意思是在打印“等待连接”之后,程序什么也不做。我假设 sock.accept() 没有返回。
  • @user3817250 如果您找到了问题的解决方案,请将其添加为正确的“答案”并接受该答案,这样您的问题就不会再显示为“未回答”了。跨度>

标签: python sockets python-2.7 tcp debian


【解决方案1】:

我认为,这是正常行为,因为您的代码侦听 连接。 connection, client_address = sock.accept() 仅在您尝试连接到脚本正在侦听的端口时才会执行。你需要telnet localhost:9764 才能让它工作。

我可能弄错了,但你从来没有提到你尝试连接到这个端口。

【讨论】:

  • 我确实连接到了这个端口。我将立即使用 tcpdump 更新我的问题。我的 GPS 调制解调器大约每 60 秒向该端口发送一次数据。
【解决方案2】:

问题是,您正在明确地监听 loopback 设备(lo,IP 127.0.0.1 aka localhost 绑定到该设备)。

如果您想绑定到所有设备(并且您不关心安全隐患),请使用空字符串作为主机

server_address = ('', 8764)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2021-12-16
    • 2021-01-31
    • 2011-04-20
    • 2017-09-03
    相关资源
    最近更新 更多