1

我创建了简单的直径客户端和服务器(链接到源)。客户端必须发送 10000 条 ccr 消息,但在 wireshark 中我看到只会发送约 300 条 ccr 消息。其他消息在客户端引发超时。我在装有 Windows 7 的不同计算机上运行服务器和客户端。我在 JDiameter 源代码行中找到了 jdiameter 发送 ccr 的位置(第 280 行),我认为如果套接字的发送缓冲区已满,ccr 未发送。我在第 280 行之前添加了这段代码

while(bytes.hasRemaining())

客户端发送〜9900 ccr,但非常慢。我在用c ++编写的其他直径服务器上测试客户端,客户端(在jdiameter上没有我的更改)发送〜7000 ccr,但该服务器托管在debian上。

我不知道如何解决这个问题,感谢您的帮助。

4

1 回答 1

1

如果发送方的发送返回零,则表示发送方的套接字发送缓冲区已满,这反过来意味着接收方的套接字接收缓冲区已满,这反过来意味着接收方的读取速度比发送方的发送速度慢。

所以加快接收器的速度。

注意 在非阻塞模式下,仅在write()调用返回零时循环调用是不够的。如果write()返回零,您必须:

  1. 取消注册频道OP_READ并为其注册OP_WRITE
  2. 返回选择循环。
  3. 触发时OP_WRITE,再次写入。这一次,如果它返回零,则 deregisterOP_WRITE和(可能根据您的要求) register OP_READ

请注意,OP_WRITE始终注册频道也是不正确的。套接字通道几乎总是可写的,这意味着套接字发送缓冲区中几乎总是有空间。你感兴趣的是不可写和可写之间的转换。

于 2014-03-18T12:33:08.030 回答