关于SELECT连接超时的问题

wanjinball 2005-01-01 04:13:38
一个连接对方指定端口的程序,使用下边的代码进行连接.遇到几个问题:
1、在有的计算机上,如果连接的IP没有监听指定的端口,SELECT马上就能返回,但是返回值为1,也就是显示连接成功;
2、在另外有的计算机上,如果连接的IP存在但没有监听指定的端口,SELECT直到15秒后才返回超时,而直接使用阻塞模式的Connect回马上返回连接错误。
请大虾指点迷津

BOOL MyConnect(CSocket &s,LPCTSTR dip,int dport)
{
WSADATA wsd;
int ret;
struct sockaddr_in server;
hostent *host=NULL;

if(WSAStartup(MAKEWORD(2,0),&wsd))
return FALSE;
//set Recv and Send time out
int TimeOut=6000;
if(::setsockopt(s.m_hSocket,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
return FALSE;
TimeOut=6000;
if(::setsockopt(s.m_hSocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
return FALSE;

unsigned long ul = 1;
ret = ioctlsocket(s.m_hSocket, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)
return FALSE;

server.sin_family = AF_INET;
server.sin_port = htons(dport);
server.sin_addr.s_addr = inet_addr((LPCSTR)dip);
if(server.sin_addr.s_addr == INADDR_NONE)
return FALSE;

connect(s.m_hSocket,(const struct sockaddr *)&server,sizeof(server));

struct timeval timeout ;
fd_set r;

FD_ZERO(&r);
FD_SET(s.m_hSocket, &r);
timeout.tv_sec = 15;
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
return FALSE;
}

WSAEventSelect(s.m_hSocket,(WSAEVENT)&r,0);
unsigned long ul1= 0 ;
ret = ioctlsocket(s.m_hSocket, FIONBIO, (unsigned long*)&ul1);
if(ret==SOCKET_ERROR)
return FALSE;
else
return TRUE;
}
...全文
410 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
净天宇 2005-01-04
  • 打赏
  • 举报
回复
UP
nuaawenlin 2005-01-03
  • 打赏
  • 举报
回复
你设置的超时只有15毫秒呀,怎么说是15秒呢
kingzai 2005-01-02
  • 打赏
  • 举报
回复
http://www.chinaunix.net/jh/23/136566.html
sharkhuang 2005-01-02
  • 打赏
  • 举报
回复
select然后看看是什么错误!是read 返回是wirte返回还是异常
zengwujun 2005-01-02
  • 打赏
  • 举报
回复
告诉大家一个秘密:
楼主的代码居然是抄的呢:(
Kudeet 2005-01-01
  • 打赏
  • 举报
回复
gz

http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=196343
fanqing 2005-01-01
  • 打赏
  • 举报
回复
up

18,356

社区成员

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

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