学Winsocket的朋友请进:CSocket编程请教 a>IsBlocking()函数应该在套接字进程中调用!b>当套接字已经阻塞时,可以调用CancelBlockingCall从阻塞中解脱出来; 位置应该放在: >>套接字进程中 >>或当前正在运行的进程中 >>或主进程中 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在单线程的程序中,阻塞是不可避免的,解决这个问题的办法就是利用CSocket/CAsyncSocket的多线程特性,我最喜欢的一种方法就是从 CAsyncSocket 派生自己的类CMySocket ,再由它向主窗口发送各种消息.CMySocket ::public CAsyncSocket {CWnd * m_pWnd; CMySocket (CWnd * pWnd){m_pWnd=pWnd}; //此处保留主窗口...//定义消息映射函数...}CMySocket ::OnReceive(...){m_pWnd->PostMessage(...); //可用系统消息,也可自定义.}... 从 CAsyncSocket 派生自己的类CMySocket ,在该类的OnReceiver中接收服务端的数据,并进行处理,如果要发送数据,可以直接使用send函数。这里要用循环判断是否完全发送成功,接收时也要判断接收数据的正确性。 用异步方式不会阻塞呀比如Receive函数,应该在OnReceive中调用,因为这时已经有数据了,所以函数会立即返回。其它函数也差不多。 有关阻塞的问题:如果要解决阻塞的问题,可以使用select函数(API),这个函数可以设置一个超时值,在超过超时值之后可以自动返回。另外,阻塞与死循环是不一样的,在阻塞时,线程(进程)是不占用时间片的,不会占用太多的系统资源,而死循环则往往会过度占用系统资源。如果你是在重载的OnReceive函数中调用Receive函数,那么这个函数并不会引起阻塞。 谢谢大家的热心帮助,能跟人讨论感觉是不一样。Receive()函数是不是一定要在OnReceive()函数中调用呢?还有,我在客户端程序一启动就执行的函数中曾经用广播寻找服务器(局域网),服务器端的数据报套接字收到广播后(的确能收到)用刚得到的对方端口和地址返回应答SendTo()://收广播RadioSock.ReceiveFrom(m_lpBuf,512,rPeerAddr,rPeerPort);...//返回应答RadioSock.SendTo(m_lpBuf,20,CLIENT_ACKPORT,rPeerAddr);但在客户端://发送广播DgramSock1.SendTo(lpBuf,10,HOST_RADARPORT);……//等待应答DgramSock2.ReceiveFrom(lpBuf,512,rHostAdd,rHostPort);程序到了上面的最后一条语句,就再也出不来了,(阻塞?)该怎办???又提了问题,帖子该加分了。 00h,I'm eager for your touch Receive()并不是一定要在OnReceive()中调用,你可以在任何你想用的地方使用,OnReceive只是一个消息通知函数,主要作用是告诉你现在有数据传来,请接收! zhq2000你好,按你说要是我在一处使用循环调用Receive(),就象读文件一样,希望读到到文件尾时返回0字节,调用Receive()返回0时,循环结束。可是这样是不是容易造成阻塞啊?假如我希望接收连续的一块一块的数据,那该怎么办? 列编辑模式的文本控件 请问怎么在vc6.0中通过namespace调用dll中的函数 请问各位高手,实现WAV文件流双缓冲播放有什么好的例子 关于全屏与窗口的转化 (SDK) vc调试中的一个小问题,求教大家了 求助啊!!!帮我!!已经问了好几次了 有人作过qq协议还原吗? 急!急!急!无法启动多个应用程序,恳请高手指点一二。 如何正确处理DLL中的资源问题? 谁知道哪里有《Unauthorized Windows 95》《Undocumented Windows 》这两本书? 谁能告诉我在那里能够查到InvokeHelper的资料? 消息传递问题
{
CWnd * m_pWnd;
CMySocket (CWnd * pWnd){m_pWnd=pWnd}; //此处保留主窗口
...
//定义消息映射函数
...
}CMySocket ::OnReceive(...)
{
m_pWnd->PostMessage(...); //可用系统消息,也可自定义.
}...
比如Receive函数,应该在OnReceive中调用,因为这时已经有数据了,所以函数会立即返回。
其它函数也差不多。
如果要解决阻塞的问题,可以使用select函数(API),这个函数可以设置一个超时值,在超过超时值之后可以自动返回。另外,阻塞与死循环是不一样的,在阻塞时,线程(进程)是不占用时间片的,不会占用太多的系统资源,而死循环则往往会过度占用系统资源。
如果你是在重载的OnReceive函数中调用Receive函数,那么这个函数并不会引起阻塞。
Receive()函数是不是一定要在OnReceive()函数中调用呢?还有,我在客户端程序一启动就执行的函数中曾经用广播寻找服务器(局域网),服务器端的数据报套接字收到广播后(的确能收到)用刚得到的对方端口和地址返回应答SendTo():
//收广播
RadioSock.ReceiveFrom(m_lpBuf,512,rPeerAddr,rPeerPort);
...
//返回应答
RadioSock.SendTo(m_lpBuf,20,CLIENT_ACKPORT,rPeerAddr);但在客户端:
//发送广播
DgramSock1.SendTo(lpBuf,10,HOST_RADARPORT);
……
//等待应答
DgramSock2.ReceiveFrom(lpBuf,512,rHostAdd,rHostPort);
程序到了上面的最后一条语句,就再也出不来了,(阻塞?)该怎办???又提了问题,帖子该加分了。
假如我希望接收连续的一块一块的数据,那该怎么办?