CSocket超时(Time-Out)功能的设置及其局限性

CSocket 是一个同步的socket类,如“接收”(Receive)、“发送”(Send) 和“连接”(Connect) 均是阻塞操作,即要等到操作成功执行完毕或套接字上出现错误后,对这些函数的调用才有返回结果。如果连接不上,只有超时以后才能返回。 在某些情况下,操作可能永远不能成功完成,这将导致程序无限循环等待操作完成。例如错误的域名解释,连接不上的IP地址,这回让用户等待近 40秒钟的时间(可能是默认的超时时间),而且等待期间,程序将会"假死", 如果这种情况频繁出现,软件就无法使用了。 微软MSDN上提供了一种解决方法:通过编程限制完成操作使用的时间。只要超过这个时间,无论是否成功都要返回。 示例代码: // // HEADER FILE // class TimeOut_CSocket : public CSocket { public: BOOL SetTimeOut(UINT uTimeOut); BOOL KillTimeOut(); protected: virtual BOOL OnMessagePending(); private: int m_nTimerID; }; // // END OF FILE // // // IMPLEMENTATION FILE // BOOL TimeOut_CSocket::OnMessagePending() { MSG msg; if(::PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_NOREMOVE)) { if (msg.wParam == (UINT) m_nTimerID) { // Remove the message and call CancelBlockingCall. ::PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_REMOVE); CancelBlockingCall(); return FALSE; // No need for idle time processing. }; }; return CSocket::OnMessagePending(); } BOOL TimeOut_CSocket::SetTimeOut(UINT uTimeOut) { m_nTimerID = SetTimer(NULL,0,uTimeOut,NULL); return m_nTimerID; } BOOL TimeOut_CSocket::KillTimeOut() { return KillTimer(NULL,m_nTimerID); } 有了这个CSocket的派生类后,就能自由设置 自己的 超时时间了,例如: ... TimeOut_CSocket sockServer; CAcceptedSocket sockAccept; sockServer.Create(777); sockServer.Listen(); // Note the following sequence: // SetTimeOut // // KillTimeOut if(!sockServer.SetTimeOut(10000)) { ASSERT(FALSE); // Error Handling...for some reason, we could not setup // the timer. } if(!sockServer.Accept(sockAccept)) { int nError = GetLastError(); if(nError==WSAEINTR) AfxMessageBox("No Connections Arrived For 10 Seconds"); else ; // Do other error processing. } if(!sockServer.KillTimeOut()) { ASSERT(FALSE); // Error Handling...for some reason the timer could not // be destroyed...perhaps a memory overwrite has changed // m_nTimerID? // } ... 这个方法经过测试还是有很大地局限性,当服务器联通时,确实能按照超时时间返回,但如果域名解释有问题或者ip地址连接不上,还是需要等待20s以上的超时时间。 要达到商业化软件的要求,我们推荐还是用专业的socket组件解决网络操作问题, 例如 糖果专业下载组件 就能做到 程序随时可以退出,永不"假死": 糖果专业下载组件 支持 多源 多线程下载, 支持各种代理,尤其是 能够穿透 局域网中的 ISA Server代理服务器(需要支持NTLM认证),做到IE能上网,软件就能上网。

VC是Visual C++的缩写,Csocket是其所提供的一个网络编程类库。利用VC和Csocket可以实现远程桌面功能。 远程桌面是指通过网络连接到远程计算机,可以在本地显示并操作远程计算机的桌面。实现远程桌面功能的基本过程如下: 1. 创建一个VC项目,并添加Csocket类库。 2. 创建一个服务器端程序和一个客户端程序。服务器端程序负责接受远程控制请求,客户端程序则负责发送控制指令给服务器端。 3. 在服务器端程序,创建一个Socket对象,并绑定相应的IP地址和端口号。通过调用Socket对象的Listen方法,使其处于监听状态。 4. 在服务器端程序,通过调用Socket对象的Accept方法,等待客户端的连接请求。当客户端发起连接请求时,Accept方法会返回一个新的Socket对象,表示与客户端的连接。 5. 在服务器端程序,通过新的Socket对象,可以进行数据的接收和发送操作。通过接收客户端发送的控制指令,服务器端可以根据指令对远程桌面进行操作。 6. 在客户端程序,创建一个Socket对象,并连接到服务器端的IP地址和端口号。 7. 在客户端程序,通过Socket对象,发送控制指令给服务器端。根据用户的操作,可以发送鼠标点击、键盘输入等指令。 8. 在客户端程序,通过Socket对象,接收服务器端发送的远程桌面图像数据。接收到的图像数据可以在本地窗口进行显示。 通过以上步骤,利用VC和Csocket可以实现远程桌面功能服务器端负责接收远程控制请求并对远程桌面进行操作,客户端负责发送控制指令和接收远程桌面图像数据。这样,用户可以通过本地计算机实现对远程计算机的桌面进行操作,便捷地进行远程工作或管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值