1

我的目标是检查 GPSd 是否在端口 2947 上运行,如果它在 x 秒内再次检查。如果它没有启动 GPSd,则在 X 秒内再次检查。

我的问题是它永远不会在第二次++ 时通过/连接。

我的代码:

import socket
import os
import time

#Simply change the host and port values
host = 'localhost'
port = 2947

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

while 1:
 try:
  s.connect((host, port))
  s.shutdown(2)
  #s.close() DIDN'T WORK
  print "Success connecting to "
  print host + " on port: " + str(port)
  time.sleep(20)
 except:
  print "Cannot connect to "
  #os.system("sudo killall gpsd")
  #os.system("sudo gpsd /dev/ttyAMA0 -n -F /var/run/gpsd.sock")
  print host + " on port: " + str(port)
  #os.system("sudo killall gpsd")
  #os.system("sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock")
  time.sleep(3)

我得到了什么:

成功连接到
端口上的本地主机:2947
无法连接到
端口上的本地主机:2947
无法连接到
端口上的本地主机:2947

我已经尝试了我能想到的一切,但是因为我认为我不明白是什么导致了这个问题并没有多大帮助。

4

2 回答 2

0

我相信您正在(重新)connect在您关闭 20 秒前的同一个套接字上调用 a 。可悲的是,不能这样做。

至于 socket.shutdown 的文档说:

"Lasciate ogne speranza, voi ch'intrate"

这大致翻译为:

socket.shutdown(how)

     Shut down one or both halves of the connection. If how is SHUT_RD,
further receives are disallowed. If how is SHUT_WR, further sends are
disallowed. If how is SHUT_RDWR, further sends and receives are disallowed.

'socket.close()` 比这更最终:

all future operations on the socket object will fail.  

你可以s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)在声明之后进入循环try......我只是不知道你为什么要朝这个方向前进。

于 2015-04-21T12:57:58.717 回答
0

我相信您应该在调用关闭后调用关闭。

于 2013-05-30T02:09:54.617 回答