非阻塞套接字仍然在send()

时间:2016-07-01 08:09:50

标签: python sockets tcp network-programming

我有一个与两台服务器交互的程序(全部在localhost上),它基本上将数据从一台服务器转发到另一台服务器。
我正在尝试创建一个场景,其中发送初始数据的服务器将关闭其与中间程序的连接,因为接收数据的服务器与中间程序的连接速度非常慢。中间程序的缓冲区应该被填满,它不应该能够从发送数据的服务器接收任何数据。由于此不活动,发送数据的服务器应该超时并关闭连接,从而导致完整的数据传输 我试图通过以下方式实现:

发送数据的服务器上的程序

import socket

interval_sec = 3
TCP_KEEPALIVE = 0x10

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
sock.setsockopt(socket.IPPROTO_TCP, TCP_KEEPALIVE, interval_sec)


sock.bind(('', 9000))


sock.listen(5)


while True:
    conn, addr = sock.accept()


    f = open('test.txt', 'r')
    file_data = f.read(1024)
    while (file_data):
       conn.send(file_data)
       file_data = f.read(1024)
    f.close()
    print "sent"

中间程序转发数据

import socket
import select
import time
import struct

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

recv_timeout = 2
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, struct.pack('LL', recv_timeout, 0))

total_data=[]
total_sent=0;
data=0;

sock.connect(('localhost', 9000))
sock2.connect(('localhost', 8001))

sock2.setblocking(0)
sock.setblocking(0)

j=0

while 1:
    read, write, errors = select.select([sock], [sock2], [], 2)
    if read:
        data=sock.recv(1024, socket.MSG_DONTWAIT)
        total_data.append(data)
        #time.sleep(10)
    if write:

        if data:
            try:
                data_sent=sock2.send(data, socket.MSG_DONTWAIT)
                total_sent+=data_sent
                data=data[data_sent:]
                print data_sent
            except socket.error, e:
                if e.errno != errno.EAGAIN:
                    raise e
    else:
        print "Not writable"

接收数据的服务器上的程序

import socket

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

sock.bind(('', 8001))


sock.listen(5)


while True:
    conn, addr = sock.accept()

    with open('received_file', 'wb') as f:
        while True:
            file_data = conn.recv(100)
            print('receiving data...')
            if not file_data:
                break
            f.write(file_data)
    f.close()
    conn.close()

我面临的问题是,中间程序的套接字是阻塞的,尽管它们应该是非阻塞的。

我的程序是否从根本上是错误的,我错过了重点,还是需要做一些小的调整?

谢谢:)

0 个答案:

没有答案