我正在使用套接字库(SOCK_STREAM)在Python中开发小型服务器。服务器应该接收大量的小消息(25-40字节),处理它们并尽可能快地转发。
在Linux和OSX上它运行良好,socket的recv函数在数据到达时立即返回。不幸的是,在Windows(8 Pro)上,它似乎在返回从recv函数返回之前累积数据。
我试图限制使用recv函数读取的最大数据量,但这没有多大帮助。看起来数据是在内部累积的。
我是否必须在服务器(Python)或客户端(Java的Socket)中设置任何特定的套接字选项?
修改
我的一位同事建议用虚拟数据填充每条消息到1KB。 这可能有助于避免@PeterLawrey指出的内部缓冲区。
我没有机会尝试。你认为它可能会有所帮助吗?它是有效且广泛采用的技术吗?
答案 0 :(得分:-1)
在Java程序中操作为套接字保存的内核内存量的方法是设置SO_RCVBUF(在使用setsockopt
的C / C ++程序中执行此操作)。
我宁愿不在这里复制大量的代码,而是给你一些指导。
Documentation of SocketOptions
Documentation of SO_RCVBUF
你可以使用它们来减少内核在向你返回内容之前缓冲的数量。
也就是说,如果您的应用程序具有SOCK_STREAM,我无法看到任何原因,它不会立即返回任何可用数据。我认为可能还有其他问题。