上下文:我正在开发一个客户端 - 服务器应用程序,它在大多数情况下都是相当可靠的,尽管网络出现频繁问题,中断,管道损坏等等。我使用非阻塞套接字,select()和OpenSSL在集群中的一个或多个节点之间传递消息,这取决于应用程序级心跳。消息排队,不会从队列中删除,直到整个消息传输完毕并且所有SSL_write()成功返回。我为每个关系维护两个套接字,一个传入,一个传出。我这样做是有原因的,那是因为在写入时检测失败的连接(非常频繁)比在读取时更容易。如果客户端正在连接,并且我已经有连接,我将其替换。基本上,执行写操作的客户端负责检测错误并启动新连接(然后将替换服务器上的现有(死)读连接)。除了一个例外,这对我来说效果很好。
唉,我正在丢失消息。 99.9%的时间,消息都很好。但是我时不时地发送,并且我几分钟都没有检测到任何错误......然后我会在套接字上出错。问题是SSL_write已经成功返回。让我猜一下:如果我阻止了这将很好,但由于我是非阻塞的,我不等待远程端的读取。只要我的TCP缓冲区可以适应更多,我就会把东西塞进管道中。当我的插座出现故障时,我在那个缓冲区中丢失了什么还没有交付?
我该如何处理?应用程序级别的确需要吗? (我宁愿不走复杂的迷失方向和重复的消息复杂性的漫长道路)是否有一种优雅的方式来了解我丢失了什么信息?或者有没有办法可以延迟从我的队列中删除,直到我知道它已被交付? (没有确认,怎么样?)
感谢您提前提供任何帮助。