Windows select()只接收,不发送

时间:2015-05-26 19:16:18

标签: python linux windows sockets

我让我的Windows电脑连接到我的linux python服务器。

服务器对Linux用户非常有效,但我希望它也可以在Windows上运行。我做了一些研究,发现Windows上的 select.select() 功能没有 stdin 管道,但当我这样做时,它不会向服务器发送任何数据,只接收。

代码:

 __author__ = 'root'
import socket
import datetime
import getpass          # Get username
import sys
import threading
import thread
import select

def client():

   sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
   address = "192.168.1.17"
   sock.bind((str("192.168.1.231"), int(2222)))
   sock.connect(("192.168.1.17", int(23657)))
   sock.setblocking(0)
   sock.send(getpass.getuser()+"[$ID$]zivofek")

   socket_list = [sys.stdin, sock]
   partner = raw_input("Chat partner: ")

   while 1:
       try:
           message = raw_input()
           sock.sendall(message)
           data = sock.recv(1024)
           print data
       except:
           continue

def get_time():
   return datetime.datetime.strftime(datetime.datetime.now(), '%H:%M:%S')

def main():
   client()

if __name__ == "__main__":
   main()

如何在Windows中同时进行接收和发送?

2 个答案:

答案 0 :(得分:0)

除非您真的想要复用来自不同来源的事件(即不使用select()时),否则不要将套接字设置为非阻塞。

这里只是普通的阻止sendall()。还要检查recv()的返回长度 - 当某些数据可用时返回,并且接收零字节意味着另一端关闭连接。

再次,不要bind()或在客户端TCP套接字上设置SO_REUSEADDR

答案 1 :(得分:0)

socket_list = [sys.stdin, sock]

假设上面的socket_list的目的是将它传递给select()......这不会起作用。 select()的Windows实现仅适用于套接字,而sys.stdin不适用于套接字。

这个问题没有简单的解决方法(*);也就是说,解决这个问题的一种方法是从一个单独的线程中读取sys.stdin,并让该线程将数据发送()到连接的套接字对的一端,并将该对的另一端放入您要传递给select()的列表。或者,您可以将一个超时放入select(),以便select()经常返回,让您的偶数循环check查看stdin上是否有任何可用的字节(尽管这种机制将是CPU效率低下的)或具有高延迟,具体取决于您传递给select()的超时值 - 是否可接受将取决于您的特定使用方案)

(*)好的,有一个简单的解决方法:不要试图在Windows中运行该程序...;)