为什么GetHostByName总是阻塞的?

solomon 2000-03-06 10:17:00
我在编写一个下载软件。有几个问题向各位高手请教。
(MFC的CSocket类)
1。GetHostByName总是阻塞的?(我曾修改了 MFC 用 wsagethostbyname代替)
无论使用gethosybyname,或wsagethostbyname 都会发生阻塞。
connect 也是。而且好像永远不会产生 OnConnect

(CInternetSession, CHttpConnection等)
1. 线程如下
while(!bCancel && WSAGetLastError() == ...)
phttp->read(buf,n);
如何在另外的线程中终止它?比如是否可以 关闭该线程的 CinternetSession?
如果 置 bCancel = TRUE 必须等到 Timeout 或 读入 n 个字符后才终止。
2。如果强行终止,WinInet 分配的资源是否会回收?
...全文
636 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gentlez 2000-11-23
  • 打赏
  • 举报
回复
CSocket的connect()是阻塞式调用,OnConnect()消息从来不会发生,mfc没有对此处理,需要自己创建线程解决,仔细察看msdn.
SoftDIY 2000-03-11
  • 打赏
  • 举报
回复
gethostbyname确实是阻塞的,但应该可以设置一个time_out免得DNS Server出问题时老是执行,关于设置Time_out,参阅一下code:
int timeout = TIMEOUT_VALUE;
int err;
SOCKET s;
s = socket( ... );
err = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));



solomon 2000-03-10
  • 打赏
  • 举报
回复
就是这句话:
lphost = gethostbyname(lpszAscii);
如果 DNS Server 反应慢,就会发生阻塞
Jackzhu 2000-03-09
  • 打赏
  • 举报
回复
看一下mfc的代码
BOOL CAsyncSocket::Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
{
USES_CONVERSION;

ASSERT(lpszHostAddress != NULL);

SOCKADDR_IN sockAddr;
memset(&sockAddr,0,sizeof(sockAddr));

LPSTR lpszAscii = T2A((LPTSTR)lpszHostAddress);
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = inet_addr(lpszAscii);

if (sockAddr.sin_addr.s_addr == INADDR_NONE)
{
LPHOSTENT lphost;
lphost = gethostbyname(lpszAscii);
if (lphost != NULL)
sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
else
{
WSASetLastError(WSAEINVAL);
return FALSE;
}
}
}
solomon 2000-03-09
  • 打赏
  • 举报
回复
Jackzhu: 你能帮我试一下吗。
jing 2000-03-06
  • 打赏
  • 举报
回复
DNS会不会有问题


celxta 2000-03-06
  • 打赏
  • 举报
回复
不知你是否对Socket类已初始化了?
Jackzhu 2000-03-06
  • 打赏
  • 举报
回复
CSocket缺省是阻塞方式,CAsyncSocket缺省是非阻塞方式
solomon 2000-03-06
  • 打赏
  • 举报
回复
阻塞并不是出错,只是在解析域名时程序不向下执行。
我希望能够实现如下功能:
gethostbyname() -- 此时程序不向下执行,直到解析成功或发生超时错误。
while(select_event() && !bCancel ) -- 如果可以有select就好了。
connect
send(req)
while(!bCancel)
{
if(select(FD_READ))
read()
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧