开发类似于端口转发这类程序,在不知道传入包长度的情况下如何设定缓冲区大小?

比如说我要用C或者C++的socket开发一个端口转发,或者代理服务器之类的程序,提前无法得知用户传入的是多达长度的数据(比如说用户有可能会上传一个几十兆大小的文件),也有可能提交一个有几百kb的大段文字的表单,或者发起一个请求的时候带上10kb大的cookie和头部,还有可能下载一个几百兆大的文件,这种极端情况下,代理服务器中该如何定义IO缓冲区的大小?在开发这类程序碰到这种极端情况的处理需要注意什么?

阅读 3.9k
2 个回答

看你的描述,你是要写一个http代理,对于你说的情况无非就三种处理方案:

1.透明代理,对请求和应答数据直接转发,对于这种情况只要控制每次网络io读写的最大字节数小于缓冲区的大小即可。
2.非透明代理(你要看一下请求的内容是什么)采用动态缓冲区,当缓冲区不够时重新动态分配,直到内存分配失败。
3.非透明代理(你要看一下请求的内容是什么)采用固定缓冲区,比如head的value最大长度可以设置为20KB,body最大长度设置为10MB。

在项目中通常使用第1种或者第3中处理方案,第3种方案也就是只放通合理的请求而已。

新手上路,请多包涵

如果你的程序运行在 Linux/FreeBSD/Windows7, 可以直接使用系统自带的端口转发功能。 特别是Windows7及以上, 可以直接使用 portproxy https://technet.microsoft.com...

举例来说,可以

netsh interface portproxy add v4tov4 listenport=%LOCAL_PORT% connectaddress=%REMOTE_IP% connectport=%REMOTE_PORT%

这就建好了一个IPv4到IPv4的端口转发。 缺省是TCP,还可以用UDP。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题