Col*_*nee 5 c c++ sockets winapi tcp
我有一个第三方库充当HTTP服务器.我传递了一个地址和端口,然后用它来监听传入的连接.此库以这样的方式进行侦听,即它不会接收端口的唯一用法以及它所绑定的地址.结果,我可以多次在同一个端口上侦听.
我需要在同一个进程中运行此HTTP服务器的多个实例.每个实例都有一个默认端口,但如果该端口不可用,则应使用下一个可用端口.这是我的问题所在; 我最终可以在同一个端口上监听两个HTTP服务器.
我无法更改HTTP服务器的代码,如果无法侦听我提供的端口,HTTP服务器将不会提醒我,因此我必须能够在启动每个HTTP服务器之前检查端口是否已在使用中.我已经尝试通过绑定自己的套接字来检查端口是否已被监听,SO_REUSEADDR设置为FALSE且SO_EXCLUSIVEADDRUSE设置为TRUE,但是当现有HTTP服务器已经在该端口上侦听时,绑定和侦听调用都成功.
该HTTP服务器如何实现此效果,如何以这种方式准确检查是否正在侦听端口?
快速而脏的方法是尝试访问connect()localhost上的端口.如果connect()调用成功,则表示当前正在侦听端口(由接收连接的任何人).如果连接调用失败(特别是ECONNREFUSED),那么您可以非常确定没有人正在侦听该端口.
当然,这里有一个竞争条件:在你运行上述测试后,没有什么能够阻止另一个程序突然进入并抓住端口,但是在你自己绑定到端口之前.因此,您应该将测试结果视为一个提示而不是绝对规则,并且(希望)如果您稍后发现该端口正在使用中,那么(希望)有一些方法可以处理它.
| 归档时间: |
|
| 查看次数: |
5520 次 |
| 最近记录: |