在Windows上缓慢套接字的recv用于许多小消息

时间:2013-08-13 06:13:35

标签: java windows sockets python-2.7

我正在使用套接字库(SOCK_STREAM)在Python中开发小型服务器。服务器应该接收大量的小消息(25-40字节),处理它们并尽可能快地转发。

在Linux和OSX上它运行良好,socket的recv函数在数据到达时立即返回。不幸的是,在Windows(8 Pro)上,它似乎在返回从recv函数返回之前累积数据。

我试图限制使用recv函数读取的最大数据量,但这没有多大帮助。看起来数据是在内部累积的。

我是否必须在服务器(Python)或客户端(Java的Socket)中设置任何特定的套接字选项?

修改

我的一位同事建议用虚拟数据填充每条消息到1KB。 这可能有助于避免@PeterLawrey指出的内部缓冲区。

我没有机会尝试。你认为它可能会有所帮助吗?它是有效且广泛采用的技术吗?

1 个答案:

答案 0 :(得分:-1)

在Java程序中操作为套接字保存的内核内存量的方法是设置SO_RCVBUF(在使用setsockopt的C / C ++程序中执行此操作)。

我宁愿不在这里复制大量的代码,而是给你一些指导。

Documentation of SocketOptions
Documentation of SO_RCVBUF

你可以使用它们来减少内核在向你返回内容之前缓冲的数量。

也就是说,如果您的应用程序具有SOCK_STREAM,我无法看到任何原因,它不会立即返回任何可用数据。我认为可能还有其他问题。