2010-06-30 53 views
1

我有一个到第三方软件应用程序的tcpip套接字接口。我已经为几个客户站点实现了这个接口,没有任何问题。最新的客户,虽然......问题。我们已经开启了登录应用程序的任何一端,并且还在PC上安装了Wireshark以记录原始tcpip流量。有了这些,我们已经证明我的服务器应用程序成功地发送了消息,电脑收到消息,但客户端应用程序没有看到它。 (这是一个完全间歇性的问题,这就是为什么它很难排除故障。)通过套接字发送消息之前的延迟 - 这有什么帮助?

套接字的细节非常简单:一个套接字处理服务器和pc之间的双向通信。这些消息是简单的ascii文本和相当短的(不是XML)。服务器通过发送第一条消息来启动通信,然后客户端回复几条消息。在应用程序运行时,套接字始终保持打开状态。客户端应用程序的设计使最终用户一次只能处理一个案例,这样可以防止发生消息冲突。他们设置了某种轮询,他们的应用程序“休眠”,直到它看到来自服务器的启动消息。

第三方供应商建议我在发送启动消息之前添加几秒的延迟。我看不出有什么帮助。如果客户端正在“睡眠”,只是轮询等待消息的套接字,那么如何在第一条消息之前添加延迟帮助?这不像我们发送两条消息,第二条消息丢失。它失去了第一条信息。所以如果我们现在或者两秒钟之后发送这条消息,我不知道它有多重要。

我问过他们,他们没有给我详细资料。这可能是他们编码中的一些专有细节,他们不想透露给我,这很公平。所以我在这里问,因为我总是在学习有关套接字编程的新知识。也许你们可以阐明如何轮询一个tcpip套接字如何受到消息时间的影响?

回答

2

由于其他人的客户并且他们不会告诉你它在做什么(除了说'插入延迟'),答案可能是他们的客户正在阅读并丢弃该消息,因为它尚未处于状态处理它。延迟将使客户端有时间进入可以正确响应消息的状态。

换句话说,客户端有竞争条件。这可能发生的一个简单的方法是,如果他们有一个线程阅读消息,另一个线程处理它们。

在客户端运行strace(1)的缺失,以查看它正在进行的系统调用,它很难分辨客户端实际在做什么。

+0

由于这是延迟时间帮助客户更好地阅读的时间问题,另一种可能性是客户可能不会简单地正确阅读。它可能一次读取更多字节,然后它实际上知道如何处理,而不考虑单个读取可以(并且通常会)返回可能属于多个消息的字节,并且客户端负责检测并缓冲套接字数据,以便它可以正确检测消息之间的边界。许多新手套接字程序员假设1写= 1读,并且根本不是这种情况 – 2010-06-30 17:57:01

+0

如果他们有竞争条件不是更好的建议是发送我的消息两次?毕竟,在我的延误完成后,从现在开始两秒钟内什么才能避免比赛状况? – 2010-06-30 18:28:28