针对套接字和管道的select.select问题

时间:2013-09-10 11:56:12

标签: python sockets select tcp pipe

我目前正在编写一个使用管道和套接字的基本python脚本。管道当前保存来自html表单的传入数据,该套接字构成与服务器的连接,该服务器以不同的间隔发送TCP / IP命令。表单和服务器位于同一LAN但不同的计算机上。

我的代码如下:

#!/usr/bin/env python
import os,sys,time
from socket import *

HOST = 'xxx.xxx.xxx.xxx'
PORT = 6000
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
count = 0
pipe_name = 'testpipe'

if not os.path.exists(pipe_name):
    os.mkfifo(pipe_name)

def readpipe():
    pipein = open(pipe_name, 'r')
    line = pipein.readline()[:-1]
    print line
    pipein.close()

def readTCP():
    data = tcpCliSock.recv(BUFSIZ)
    print data

while count == 0:
    readTCP()
    readpipe()

我意识到count变量目前是多余的,我一直用它来尝试调试一些早期的问题

正如您所看到的,代码非常简单,只要数据首先出现在管道上,然后是套接字并保持这种模式。问题是它没有动态地运行这两个函数。它在等待套接字管道输入时挂起。我试图找到一种方法来识别管道或插座上是否没有数据,然后它可以关闭并检查另一个。到目前为止我尝试过的所有内容都没有影响,例如检查空字符串。

我在下面的文章中发现了一些有趣的东西,但它与我正在做的事情(使用标准输入)似乎有点不同所以我不确定它是否是我真正想要的或是否可能是适于;

访问What's the best way to tell if a Python program has anything to read from stdin?

根据'用户'的建议,我现在已经整理了一些额外的代码:

while True:
   inputdata,outputdata,exceptions = select.select([tcpCliSock],[],[])
   if tcpCliSock in inputdata:
      data = tcpCliSock.recv(BUFSIZ)
      print data

虽然这有效,但我还是无法找到输入管道输入数据的标识符。我已经阅读了选择模块,显然它确实可以使用管道,但似乎有很少的信息,它是所有联网的东西。 我尝试了以下内容(取自上面的主要代码):

 testpipe
 pipe_name
 pipein

但是我得到了各种错误,其中大多数与 NameError相关 - 未定义 TypeError:参数必须是int,或者有fileno()方法 < / p>

1 个答案:

答案 0 :(得分:0)

通常你会使用select模块。

import select
sockets_with_read_data, sockets_with_write_data, sockets_with_some_data = \
    select.select([sock, pipe], [], [], timeout = None)

但我不知道这对管道有效。