我创建简单直径的客户端和服务器(Link to sources)。客户端必须发送10000 ccr消息,但在wireshark中,我发现只会发送~300 ccr消息。其他消息在客户端上引发超时。我使用Windows 7在不同的计算机上运行服务器和客户端。我在JDiameter源 line where jdiameter sended ccr (line 280)中找到了,我想如果发送套接字的缓冲区已经完全没有发送ccr。我在第280行之前添加了这段代码
while(bytes.hasRemaining())
客户端发送~9900 ccr,但非常慢。我测试了客户端在其他直径服务器上写了c ++,客户端(在jdiameter上没有我的更改)发送~7000 ccr,但这个服务器托管在debian上。
我不知道如何解决这个问题,谢谢你的帮助。
答案 0 :(得分:1)
如果发送方的发送返回零,则表示发送方的套接字发送缓冲区已满,这反过来意味着接收方的套接字接收缓冲区已满,这反过来意味着接收器的读取速度比发送者发送的速度慢。
因此加速接收器。
NB在非阻塞模式下,仅在write()
调用返回零时循环是不够的。如果write()
返回零,您必须:
OP_READ
的频道,并将其注册为OP_WRITE
OP_WRITE
触发时,请再次写入。这一次,如果没有返回零,请取消注册OP_WRITE
,并(可能根据您的要求)注册OP_READ
。请注意,始终为OP_WRITE
注册的频道也不正确。套接字通道几乎总是可写的,这意味着套接字发送缓冲区中几乎总是有空间。您感兴趣的是不 - 可写和可写之间的转换。