[winsock] connect()函数处阻塞时间过长,如何解决?

dos5gw 2010-06-25 03:04:34
int PASCAL FAR connect (SOCKET s, const struct sockaddr FAR *name, int namelen);

(1)如果服务器端程序已经运行, 客户端执行connect()函数,正常没问题,
(2)如果服务端程序没有运行的时候,客户端执行connect()函数,会在此函数停留很长时间,整个程序界面几乎死掉,要3秒左右才能执行完connect()函数并返回结果,

请问如何在(2)的情况下让connect函数立刻返回?
...全文
759 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
时候后 2011-09-13
  • 打赏
  • 举报
回复
是什么原因造成的
Shrek_MyCpp 2010-06-26
  • 打赏
  • 举报
回复
我赞同2楼。
我在项目里 都是用另起线程 阻塞等待的方法。

我对非阻塞不是很懂。不知道是否有风险。
liyinlei 2010-06-25
  • 打赏
  • 举报
回复
用WSAAsyncSelect 也不错。
socoola 2010-06-25
  • 打赏
  • 举报
回复
使用WSAAsyncSelect,connect马上返回,在界面中响应消息WM_SOCKET消息
keven1868 2010-06-25
  • 打赏
  • 举报
回复
一楼正解~
雪影 2010-06-25
  • 打赏
  • 举报
回复
1楼正解
可以考虑新开一个线程执行select代码语句,在select函数返回之后,再通知UI
liyinlei 2010-06-25
  • 打赏
  • 举报
回复
可以创建一个线程,由这个线程去connect,再把连接结果通知界面线程,这样界面就不会停住了。
lijianli9 2010-06-25
  • 打赏
  • 举报
回复
//设置非阻塞方式连接
unsigned long ul = 1;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)return 0;

//连接
server.sin_family = AF_INET;
server.sin_port = htons(25);
server.sin_addr .s_addr = inet_addr((LPCSTR)pSmtp);
if(server.sin_addr.s_addr == INADDR_NONE){return 0;}

connect(cClient,(const struct sockaddr *)&server,sizeof(server));

//select 模型,即设置超时
struct timeval timeout ;
fd_set r;

FD_ZERO(&r);
FD_SET(cClient, &r);
timeout.tv_sec = 15; //连接超时15秒
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
::closesocket(cClient);
return 0;
}
//一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
unsigned long ul1= 0 ;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul1);
if(ret==SOCKET_ERROR){
::closesocket (cClient);
return 0;

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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