CSocket类怎样设置超时?(83分,决不食言)
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




