CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

CSocket类怎样设置超时?(83分,决不食言)

楼主coolworm2000(我笑得好开心)2000-11-28 18:03:00 在 VC/MFC / 基础类 提问

setsockopt不好用,天啊,我该怎么办? 问题点数:90、回复次数:13Top

1 楼sxbyl(sxbyl)回复于 2000-11-28 18:09:00 得分 0

用CAsyncSocket或Socket   API   2.0Top

2 楼coolworm2000(我笑得好开心)回复于 2000-11-28 18:41:00 得分 0

谢谢,能否说清楚一点?Top

3 楼hu_zy(白痴一个)回复于 2000-11-28 19:55:00 得分 0

呵呵,顺便问一下CAsyncSocket   怎么设成blocking的socket?Top

4 楼hanphy(动力牛车)回复于 2000-11-28 20:11:00 得分 0

aTTTop

5 楼lenyu(剑客。孤星)回复于 2000-11-29 11:06:00 得分 10

CAsyncSocket里面用  
  SetSockOpt(SO_RCVTIMEO,&nRcvTimeOut,sizeof(nRcvTimeOut));  
  可以设置接受超时  
   
  Top

6 楼lenyu(剑客。孤星)回复于 2000-11-29 11:12:00 得分 10

用CAsyncSocket::IOCtl(long   lCommand,   DWORD*   lpArgument)来设置非阻塞模式  
  lpCommand为FIONBIO    
  lpArgument指向一个为零的DWORD   Top

7 楼hendery(hendery)回复于 2000-11-29 11:22:00 得分 30

MFC的CAsyncSocket、CSocket用的是winsock   1.0的API,所以无法在Socket中设置超时。  
  如果你非要用CSocket,只好自己在窗口中加个定时器来判断超时了,还要设置为非阻塞模  
  式。如果你非要用Socket来直接判断超时,建议你该用winsock   2.0的API来写,可以设置  
  超时。  
  Top

8 楼Tiro(Tiro)回复于 2000-11-29 12:02:00 得分 10

我拷了一个类,我测试过了  
   
  ///     sock.h  
   
  #include   "stdafx.h"  
   
  class   CSock   :   public   CSocket  
  {  
  virtual   BOOL   ConnectHelper(const   SOCKADDR*   lpSockAddr,   int   nSockAddrLen);  
  virtual   void   OnClose(   int   nErrorCode   );  
  public:  
  CSock()   {   m_Kill   =   TRUE;   }  
  BOOL m_Kill;  
  };  
   
  /////     sock.cpp  
  #include   "stdafx.h"  
  #include   "Sock.h"  
   
  ///   CSocket   modify   -   timeout   module.  
  BOOL   CSock::ConnectHelper(const   SOCKADDR*   lpSockAddr,   int   nSockAddrLen)  
  {  
  if   (m_pbBlocking   !=   NULL)  
  {  
  WSASetLastError(WSAEINPROGRESS);  
  return     FALSE;  
  }  
   
  m_nConnectError   =   -1;  
   
  if   (!CAsyncSocket::ConnectHelper(lpSockAddr,   nSockAddrLen))  
  {  
  if   (GetLastError()   ==   WSAEWOULDBLOCK)  
  {  
  //   Insert....  
  CTime curt,   st;  
  CTimeSpan span(0,   0,   0,   m_nTimeOut);  
   
  st   =   CTime().GetCurrentTime();  
  //.......  
  while   (PumpMessages(FD_CONNECT))  
  {  
  if   (m_nConnectError   !=   -1)  
  {  
  WSASetLastError(m_nConnectError);  
  return   (m_nConnectError   ==   0);  
  }  
  //   Insert....  
  curt   =   CTime().GetCurrentTime();  
  if(curt   >   (st+span))  
  return   FALSE;  
  //..............  
  }  
  }  
  return   FALSE;  
  }  
  m_Kill   =   FALSE;  
  return   TRUE;  
  }  
   
  void   CSock::OnClose(int   nErrorCode)  
  {  
  m_Kill   =   TRUE;  
  }  
   
   
  Top

9 楼alanlee()回复于 2000-11-29 14:10:00 得分 20

CSocket   没什么好办法设超时  
  你可以用   socket   的   SDK   API    
  那里就很好用啦  
  超时完全自己控制,当然你要加自己的线程控制  
  但开销比CSocket还是小很多的Top

10 楼HaoGeGe(交流的方向)回复于 2000-11-29 15:47:00 得分 0

CSocket本身不能完成你的功能.  
  Tiro说的是那个类我也用过,你可以参考之.Top

11 楼bingliu()回复于 2000-12-02 21:40:00 得分 40

在CSocket中重载receive和send函数,然后直接操作m_hSocket变量。用FD_SET和select函数,具体的可以看MSDN。Top

12 楼meifen(meifen)回复于 2001-07-13 13:00:52 得分 0

sTop

13 楼april_jia()回复于 2001-11-08 16:50:06 得分 0

关于Tiro的程序的做法我有些建议。我看了一下MFC的源程序CSocket的m_nTimeOut变量是用在PumpMessage()函数中的,它的用途不是我们在这里讨论的这种,所以你的程序确实可以执行,很管用,但是我建议在CSock中再定义一个变量来代替这个变量。再有,我不知道ConnectHelper这个函数有什么用,在哪里被调用的。谢谢。Top

相关问题

  • 送分!!!!!!当天结帐,决不食言。
  • 给热心人加分,决不食言!
  • *****500分求解问题,决不食言!!!!!
  • 即刻给分,决不食言!!!!
  • 1000分大奉送!!!!!决不食言!
  • 1000分大奉送!!!!!决不食言!
  • 如何对Csocket类设置超时?
  • 500分,决不食言,求WDL的文档制作器
  • 300分的问题,决不食言,答对给分!
  • 谁第七个答复就加给谁,决不食言!!!!!

关键词

  • 函数
  • 超时
  • csocket
  • connecthelper
  • nconnecterror
  • csock
  • nsockaddrlen
  • casyncsocket
  • 设置
  • 变量

得分解答快速导航

  • 帖主:coolworm2000
  • lenyu
  • lenyu
  • hendery
  • Tiro
  • alanlee
  • bingliu

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo