Winsock完成端口模型中如何使用不阻塞的gethostbyname,用于Socks5代理服务器,需要远程解析地址

来源:百度知道 编辑:UC知道 时间:2024/06/01 05:28:07
Winsock完成端口模型中如何使用不阻塞的gethostbyname,用于Socks5代理服务器,需要远程解析地址。
有个WSAAsyncGetHostByName需要一个窗口来接受消息很不方便,因为服务器程序注册成服务运行的,根本就没有CreateWindowEx.
用完成端口就是为了避免大量的线程,这样的程序平时有将近2000个Socket在工作,当客户端打开网页时会出现巨大的gethostbyname访问,上千的线程,明显不能采用多线程解决这个问题。
注意:是gethostbyname内部阻塞,和工作的Socket句柄是无关的,就是说gethostbyname假设域名不存在,会有n秒的阻塞再返回结果,存在返回也不快,主要是调用次数多。

采用多线程试一下
或者
采用WSAAsyncGetHostByName,可以在程序初始化时创建一个不可见窗口,对于注册后的服务器程序也是可行的。例如很多托盘程序做的,你只需稍稍修改就可以

使用api函数 WSAGETSELECTEVENT()函数接受管理socket,当接受到请求时使用gethostbyname
如:swich(WSAGETSELECTEVENT(socket))
CASE FD_ACCEPT: gethostbyname

WSAGETSELECTEVENT()是实现非阻塞编程的关键

---------------------------------------------------
这问题是不好办,我也碰到过,可以这样做:
1 为gethostbyname开辟一个独立的线程,程序有用到gethostbyname的地方开启线程立即返回,第二次来了就线程通信,看看上次的解析请求作好了没,没好再返回,做别的事情。
2 重写resolver系列函数,就是比较麻烦,我这有部分代码,有兴趣defeattroy@163.com
-----------------------------------------------------

我发现现在baidu越来越冷清了。

lz还是去CSDN吧。。。

查了一下MSDN,发现这个问题还真不好解决。
winsock不行可以尝试用winpcap和libnet/libdnet来解决。
——————————————————
想要不阻塞,写在两个线程果然比较好