CSocket::ReceiveFrom():调用以后阻塞(blocking)了,请问如何设置为非阻塞模式? u_long tulbm = 1;ioctlsocket (s, FIONBIO, &tulbm); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TO:pursuer_zhao(永远有多远)我试过了,没有用的,代码如下:CSocket s;s.Create(800, SOCK_DGRAM)u_long tulbm = 1;ioctlsocket (s.m_hSocket, FIONBIO, &tulbm);char szRecv[20];CString szIP;UINT uPort;m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort); <------------调用始终阻塞在这里AfxMessageBox("After ReceiveFrom"); CSocket就是阻塞方式的,要么用CAsyncSocket,要么自己用API写个异步通信的类 可以用WSAIoctl检查一下有没有数据,先。 To wwwsq(wwwsq)兄: CSocket是从CAsyncSocket继承的,应该支持非阻塞方式 CSocket自己解决阻塞问题,最好放到线程中 to sgr0426()兄: 不懂,能不能讲明白一点? TO zzh()兄: 我开始的时候已经设置为非阻塞模式,可是调用ReceiveFrom函数后还是被阻塞了 你可以看看上面的代码(就9行)。 要么你发个代码我试试看。 无论如何,在下先谢谢了。 LRESULT CSvrView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {char recvbuf[100];char sendbuf[100];memset(recvbuf,0,sizeof(recvbuf));int stat0,stat1;switch(message){case WM_SOCK:{switch(lParam){case FD_READ:stat0=recv(clientsock[0],tempbuf,sizeof(recvbuf),0);if(stat0==SOCKET_ERROR){Message("recv ERROR!");}elseMessage("client[0] send %s",tempbuf);WSAAsyncSelect(clientsock[0],this->m_hWnd,WM_SOCK,FD_WRITE¦FD_CLOSE);break;case FD_WRITE:break;case FD_CLOSE:closesocket(clientsock[0]);Message("clientsock[0] closed");break;default:break;}}}return CEditView::WindowProc(message, wParam, lParam);}自己看吧,看懂了就好了 从CSOCKET派生一个类,并重载OnReceive函数,在里面执行ReceiveFrom等处理。 阻塞模式下的超时机制:FD_SET fd = {1, m_hSocket};TIMEVAL tv = {nSecs, 0};if(select(0, &fd, NULL, NULL, &tv) == 0) { return SOCKET_ERROR;}int nBytesReceived;if((nBytesReceived = recv(m_hSocket, pch, nSize, 0)) == SOCKET_ERROR) { throw new CBlockingSocketException("Receive");}return nBytesReceived; 谢谢各位,问题解决:原来我的类是从CSocket继承的,失去了异步特性。改从CAsyncSocket继承后问题解决。谢谢各位 从CSocket派生的一样支持异步特性,只是在Create时设置标志或用缺省值。 ado读取oracle记录总数的时候为什么总是报错? 请教socket非阻塞模式下connect错误的问题? 菜鸟继续问:activex连接 数据库 这样的界面怎样实现为好? 用鼠标点击控件弹出的模式对话框能正常关闭,但是为什么捕获键盘消息弹出的模式对话框就不能正常关闭?具体请看,急。。。。。 如何显示打开对话框? 如何使CList控件响应 回车 键(内有源码) 100分求助:为什么我的程序停不下来----关于串口通讯 求高手解决一个数组中数据处理的问题 CRecordSet::AddNew()求助! 祝贺大家圣诞快乐! 兄弟们,帮忙啊!!!
CSocket s;
s.Create(800, SOCK_DGRAM)
u_long tulbm = 1;
ioctlsocket (s.m_hSocket, FIONBIO, &tulbm);char szRecv[20];
CString szIP;
UINT uPort;
m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort); <------------调用始终阻塞在这里
AfxMessageBox("After ReceiveFrom");
CSocket是从CAsyncSocket继承的,应该支持非阻塞方式
不懂,能不能讲明白一点?
我开始的时候已经设置为非阻塞模式,可是调用ReceiveFrom函数后还是被阻塞了
你可以看看上面的代码(就9行)。
要么你发个代码我试试看。 无论如何,在下先谢谢了。
{
char recvbuf[100];
char sendbuf[100];
memset(recvbuf,0,sizeof(recvbuf));
int stat0,stat1;
switch(message)
{
case WM_SOCK:
{
switch(lParam)
{
case FD_READ:
stat0=recv(clientsock[0],tempbuf,sizeof(recvbuf),0);
if(stat0==SOCKET_ERROR)
{
Message("recv ERROR!");
}
else
Message("client[0] send %s",tempbuf);
WSAAsyncSelect(clientsock[0],this->m_hWnd,WM_SOCK,FD_WRITE¦FD_CLOSE);
break;case FD_WRITE:break;
case FD_CLOSE:
closesocket(clientsock[0]);
Message("clientsock[0] closed");
break;
default:
break;
}
}
}
return CEditView::WindowProc(message, wParam, lParam);
}
自己看吧,看懂了就好了
TIMEVAL tv = {nSecs, 0};
if(select(0, &fd, NULL, NULL, &tv) == 0) {
return SOCKET_ERROR;
}int nBytesReceived;
if((nBytesReceived = recv(m_hSocket, pch, nSize, 0)) == SOCKET_ERROR) {
throw new CBlockingSocketException("Receive");
}
return nBytesReceived;
原来我的类是从CSocket继承的,失去了异步特性。
改从CAsyncSocket继承后问题解决。
谢谢各位