如何处理SSL连接过早关闭

时间:2010-12-07 22:06:00

标签: c++ networking proxy openssl

我正在编写一个代理SSL连接的代理服务器,它对于正常流量来说都非常好。但是,如果有大量文件传输(超过20KB),如电子邮件附件,则在文件写入完成之前,将在TCP级别重置连接。我正在使用非阻塞IO,并为每个特定连接生成一个线程。

当连接进来时,我会执行以下操作:

  • 产生一个线程
  • 连接到客户端(未加密)并读取连接请求(忽略所有其他请求)
  • 为服务器创建安全连接(使用openssl api的SSL)
  • 告诉客户我们联系了服务器(未加密)
  • 创建与客户端的安全连接,并使用select循环开始在两者之间代理数据,以确定何时可以进行读写。
  • 关闭底层套接字后,或者出现错误,关闭连接,并终止线程。

就像我说的,这对于正常大小的数据(常规网页和其他东西)非常有用,但是一旦文件太大而导致错误代码(取决于所使用的webapp)或错误:连接就会失败中断。

我不知道导致连接关闭的原因是什么,无论是TCP,HTTP还是SSL特定的,我根本找不到任何关于它的信息。在某些浏览器中,如果我在SSL_write之后立即放置一个sleep语句,它将开始工作,但这似乎会在其他浏览器中引起其他问题。睡眠不一定很长,真的只是一个延迟。我目前将它设置为每次写入4毫秒,每次读取2毫秒,这完全修复了旧的firefox,带有HTTP上传的chrome和opera。

任何线索都将不胜感激,如果您需要更多信息,请与我们联系。先谢谢!

萨姆

1 个答案:

答案 0 :(得分:0)

如果网络应用认为上传的文件太大,它会做什么?如果它有权关闭连接,那将导致发送方的ECONN:'connection reset'。无论它做什么,当您编写代理时,并且假设您的代码中没有导致此问题的错误,您的任务是反映下游连接中发生的上游连接。在这种情况下,答案就是做你正在做的事情:关闭上游和下游套接字。如果您从服务器获得了传入的close_notify,请在客户端附近执行有序的SSL;如果你有ECONN,只需直接关闭客户端套接字,绕过SSL。