我在Windows Mobile 6.0上遇到了问题。 我想创建一个没有的TCP连接 使用Nagle算法,所以它在我打电话时发送我的数据 “发送”功能,并没有缓冲呼叫,也有 少量数据。
我尝试了以下内容:
BOOL b = TRUE; setsockopt(socketfd,IPPROTO_TCP,TCP_NODELAY,(char *)(& b),sizeof(BOOL));
它在桌面上运行良好。但是在Windows Mobile上,如果我 设置这个值,比我查询它,返回 值为8.并且网络流量分析显示了 没有改变。
有没有办法强制冲洗我的插座?
答案 0 :(得分:1)
在我看来,Windows Mobile版不支持TCP_NODELAY选项。查看MSDN文档,它可能会产生相应的效果,但我记得有一段时间没有设置几个套接字选项,包括TCP_NODELAY和设置发送和接收缓冲区,并且setsockopt调用将失败。检查setsockopt是否返回false,如果没有,请获取:: WSAGetLastError()并查看是否会引导您到任何地方。就我而言,我记得不得不这些选项,因为它们不受支持。我正在使用Windows Mobile 5。
答案 1 :(得分:0)
您是在连接的两端设置选项还是在建立连接后?我只是有人测试它,它在TCP上通过ActiveSync工作得很好,显着改善了测试应用程序中的命令响应周期时间(事实上大约提高了4倍)。
答案 2 :(得分:0)
服务器给出我无法修改它,但是:我们的Symbian客户端 使用此选项可以正常使用它。 我尝试在创建连接之前和之后设置此选项 但没有改变。 我在Windows Mobile Device Center上使用TCP(因为我使用的是Vista)。
答案 3 :(得分:0)
它刚刚发生在我身上(这是一个疯狂的猜测,可能不太可能)但是由于您的发送缓冲区小于您正在编写的数据的大小,您可能会遇到延迟的ack问题。 Nagle可能与它无关。
接收方是否立即发回任何数据?如果没有,你的同伴会将它的延迟时间延迟200毫秒,等待它对某些数据进行捎带,以便更好地利用带宽。
当套接字上的发送缓冲区小于这种情况下的数据时,写入的调用将阻塞,直到收到确认并发送了所有数据。
例如,如果您的发送缓冲区是8192个字节并且您发送了8193个字节并且您的对等方没有发回任何数据那么您的写入将阻塞200ms(或者您的对等实现延迟ack的时间长)有效地使其看起来像Nagle正在查杀你甚至在它被禁用的时候。
如果是这种情况,您可以增加发送缓冲区大小,或者让对等方总是向您发回空字节以强制立即发送确认。
否则,我可能会尝试使用NTttcp_x86来模拟您的应用程序发送/接收模式,看看是否还有其他事情发生。