Python 我是否正确使用ioctl?

Python 我是否正确使用ioctl?,python,macos,sockets,ioctl,kqueue,Python,Macos,Sockets,Ioctl,Kqueue,我正在用python3.3编写一个http服务器,只是为了学习如何做这类事情。在解析请求的函数中,我想使用fcntl.ioctl来获取套接字中可以读取的字节数,只有在检查kqueue的结果中看到kevent时,我才会这样做,kqueue表示套接字上有要读取的内容。但是每当我试图调用fcntl.ioctl,我都会得到OSError:[Errno 14]错误地址。我做错了什么?而且,这似乎是发生在第一个电话。以下是相关代码: def client_thread(kq, client_socket,

我正在用python3.3编写一个http服务器,只是为了学习如何做这类事情。在解析请求的函数中,我想使用
fcntl.ioctl
来获取套接字中可以读取的字节数,只有在检查kqueue的结果中看到kevent时,我才会这样做,kqueue表示套接字上有要读取的内容。但是每当我试图调用
fcntl.ioctl
,我都会得到
OSError:[Errno 14]错误地址。我做错了什么?而且,这似乎是发生在第一个电话。以下是相关代码:

def client_thread(kq, client_socket, methods):
    while True:
        events = kq.control([], 2, POLLTIME) #we pass an empty list of changes, because we don't have any changes to make to the events we are interested in.
                                #we want a list that is at most two long. We listen for POLLTIME seconds.
        for event in events:
            if event != KILL_KEV: #there are only two events in our kqueue
                handle_client(client_socket, methods)
            else: #KILL_SOCK has a connection
                break
    client_socket.close()
    client_socket.shutdown()

def handle_client(client_socket, methods):
    request = parse_request(client_socket) #parse the request data in the client socket
    handlers = methods[request["request"]["method"]] #retrieve the appropriate list of handlers from the methods dict
    for path_match_pred, handler_func in handlers:
        if path_match_pred(path): #if the path matches whatever path predicate you've created...
            break
    response = handler_func(request) #... then call the appropriate handler function to handle the request
    send_response(client_socket, response) #and finally, send the response.

def parse_request(client_socket):
    """Returns the request data, parsed into a dictionary like this:
    {
        "request": {
            "method": method,
            "path": path,
            "version": HTTP version
            },
        "headers": header dictionary,
        "body": body data as a string
    }
    This should only be called if the client socket is ready for reading!
    """
    client_fd = client_socket.fileno() #get the file descriptor for the socket
    bytes_in_socket = 0
    fcntl.ioctl(client_fd, termios.FIONREAD, bytes_in_socket) #count the bytes in it
    #^^^^^^^^^THIS IS WHERE IT BREAKS
    print(bytes_in_socket, "bytes in socket")
    msg = bytearray() #make empty byte array
    while bytes_in_socket:
        msg.extend(client_socket.recv(bytes_in_socket)) #read the bytes we counted earlier
        fcntl.ioctl(client_fd, termios.FIONREAD, bytes_in_socket) #check for more bytes
        print(bytes_in_socket, "bytes left to read")

请注意,在
fcntl.ioctl
的文档中,它们提到了
arg
的可接受类型(ioctl操作的参数)。在某些情况下,(像这样),您需要传递一个
缓冲区
,或者一个支持其接口的对象。特别是,当您希望收到返回的值时。您只是在传递一个整数。

看看如何使用
ioctl
,以及
termios.FIONREAD