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

coolworm2000 2000-11-28 06:03:00
setsockopt不好用,天啊,我该怎么办?
...全文
458 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
april_jia 2001-11-08
  • 打赏
  • 举报
回复
关于Tiro的程序的做法我有些建议。我看了一下MFC的源程序CSocket的m_nTimeOut变量是用在PumpMessage()函数中的,它的用途不是我们在这里讨论的这种,所以你的程序确实可以执行,很管用,但是我建议在CSock中再定义一个变量来代替这个变量。再有,我不知道ConnectHelper这个函数有什么用,在哪里被调用的。谢谢。
meifen 2001-07-13
  • 打赏
  • 举报
回复
s
bingliu 2000-12-02
  • 打赏
  • 举报
回复
在CSocket中重载receive和send函数,然后直接操作m_hSocket变量。用FD_SET和select函数,具体的可以看MSDN。
Tiro 2000-11-29
  • 打赏
  • 举报
回复
我拷了一个类,我测试过了

/// 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;
}


hendery 2000-11-29
  • 打赏
  • 举报
回复
MFC的CAsyncSocket、CSocket用的是winsock 1.0的API,所以无法在Socket中设置超时。
如果你非要用CSocket,只好自己在窗口中加个定时器来判断超时了,还要设置为非阻塞模
式。如果你非要用Socket来直接判断超时,建议你该用winsock 2.0的API来写,可以设置
超时。
lenyu 2000-11-29
  • 打赏
  • 举报
回复
用CAsyncSocket::IOCtl(long lCommand, DWORD* lpArgument)来设置非阻塞模式
lpCommand为FIONBIO
lpArgument指向一个为零的DWORD
lenyu 2000-11-29
  • 打赏
  • 举报
回复
CAsyncSocket里面用
SetSockOpt(SO_RCVTIMEO,&nRcvTimeOut,sizeof(nRcvTimeOut));
可以设置接受超时

HaoGeGe 2000-11-29
  • 打赏
  • 举报
回复
CSocket本身不能完成你的功能.
Tiro说的是那个类我也用过,你可以参考之.
alanlee 2000-11-29
  • 打赏
  • 举报
回复
CSocket 没什么好办法设超时
你可以用 socket 的 SDK API
那里就很好用啦
超时完全自己控制,当然你要加自己的线程控制
但开销比CSocket还是小很多的
hanphy 2000-11-28
  • 打赏
  • 举报
回复
aTT
hu_zy 2000-11-28
  • 打赏
  • 举报
回复
呵呵,顺便问一下CAsyncSocket 怎么设成blocking的socket?
coolworm2000 2000-11-28
  • 打赏
  • 举报
回复
谢谢,能否说清楚一点?
sxbyl 2000-11-28
  • 打赏
  • 举报
回复
用CAsyncSocket或Socket API 2.0

16,472

社区成员

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

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

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