上下文:我正在开发一个客户端 - 服务器应用程序,它在大多数情况下都是相当稳定的,尽管经常出现网络问题,中断,管道损坏等等 . 我使用非阻塞套接字,select()和OpenSSL在集群中的一个或多个节点之间传递消息,这取决于应用程序级心跳 . 消息排队,不会从队列中删除,直到整个消息传输完毕并且所有SSL_write()成功返回 . 我为每个关系维护两个套接字,一个传入,一个传出 . 我这样做是有原因的,那是因为在写入时检测失败的连接(非常频繁)比在读取时更容易 . 如果客户端正在连接,并且我已经有连接,我将其替换 . 基本上,执行写操作的客户端负责检测错误并启动新连接(然后将替换服务器上的现有(死)读连接) . 除了一个例外,这对我来说效果很好 .

唉,我丢失了消息 . 99.9%的时间,消息都很好 . 但是我时不时地发送,并且我几分钟都没有检测到任何错误......然后我会在套接字上出错 . 问题是SSL_write已经成功返回 .

让我猜一下:如果我阻止了这将没关系,但由于我是非阻塞的,我不等待远程端的读取 . 只要我的TCP缓冲区可以适应更多,我就会把东西塞进管道中 . 当我的插座出现故障时,我在那个缓冲区中丢失了什么但尚未交付?

我怎么处理这个?应用程序级别的确需要吗? (我宁愿不走复杂的迷失方向和重复的消息复杂性的漫长道路)是否有一种优雅的方式来了解我丢失了什么信息?或者有没有办法可以延迟从我的队列中删除,直到我知道它已被交付? (没有确认,怎么样?)

在此先感谢您的帮助 .