void CServeDlg::OnButton2()
{
CAsyncSocket m_sockRecv;
m_sockRecv.Create(5801,SOCK_DGRAM, FD_CLOSE,"127.0.0.1"); this->m_sockRecv.Bind(5801,"127.0.0.1");
char szRecv[20];
CString szIP("127.0.0.1");
memset(szRecv,'\0',20);
UINT uPort=5800;
int iRecv=m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); AfxMessageBox("OK!");
}对于CAsyncSocket 类的Create函数中设置的FD_CLOSE,表示没设置的FD_READ.FD_ACCEPT,FD_READ等都是阻塞的。可是:
上面点击Button2后,m_sockRecv.ReceiveFrom()竟然不阻塞,显示AfxMessageBox("OK!");
为什么呢????太困惑,我已经设置FD_READ为阻塞模式
{
CAsyncSocket m_sockRecv;
m_sockRecv.Create(5801,SOCK_DGRAM, FD_CLOSE,"127.0.0.1"); this->m_sockRecv.Bind(5801,"127.0.0.1");
char szRecv[20];
CString szIP("127.0.0.1");
memset(szRecv,'\0',20);
UINT uPort=5800;
int iRecv=m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); AfxMessageBox("OK!");
}对于CAsyncSocket 类的Create函数中设置的FD_CLOSE,表示没设置的FD_READ.FD_ACCEPT,FD_READ等都是阻塞的。可是:
上面点击Button2后,m_sockRecv.ReceiveFrom()竟然不阻塞,显示AfxMessageBox("OK!");
为什么呢????太困惑,我已经设置FD_READ为阻塞模式
解决方案 »
- VC中如何强制让窗口重绘,主要是在响应OnMove时让窗口重绘
- 请教下:被任务管理器强退的主窗口进程是否会调用DestroyWindow呢?
- 谁能告诉我界面的位图信息在内存的哪里
- 一个关于子对话框中点击树控件节点的所有事件(TVN_SELCHANGED,NM_DBLCLK)不响应的问题
- 如何用windows API里建立一个256色的位图?
- 关于控件变量的一个小问题
- 为什么我的ocx在别人的机子上用不成
- 是不是用MFC创建Automation组件时只能实现单接口,我试图加入第二个接口后,不但在Class View里看不见所有接口,而且第二个接口也无法注
- 谁有李于剑写的图形图像篇的光盘程序Vcad3.0 发给我 非常感谢,急需,好人一生平安
- smartboyme 在吗?
- 问题,endl是函数么?怎么不用加括号?
- 請問怎麼改寫這函數重載?
第三个参数,设置为FD_CLOSE, 表示只关心FD_CLOSE事件,别的事件(接受,读,写)都不关注!!!
你想阻塞, 用CSocketCSocket m_sockRecv;
m_sockRecv.Create(5801,SOCK_DGRAM,"127.0.0.1");
我在一本书中看到:
如果希望某个操作时阻塞的,则在调用Create时不要指定该操作对应的网络事件
例如:希望草Connect和Send是阻塞的,则可以使用如下:
Socket m_sockRecv;
m_sockRecv.Create(0,SOCK_STREAM,FD_WRITE|FD_OOB|FD_READ|FD_CLOSE,NULL);这是一本大学教材上的话,我想应该不会错吧??
void CServeDlg::OnButton2()
{ CSocket m_sockRecv; m_sockRecv.Create(5801,SOCK_DGRAM,"127.0.0.1");
this->m_sockRecv.Bind(5801,"127.0.0.1");
m_sockRecv.Listen(2);
char szRecv[20];
CString szIP("127.0.0.1");
UINT uPort=5800;
int iRecv=this->m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); AfxMessageBox("OK!");
}
修改如上后,单击button2后,依然会弹出AfxMessageBox("OK!");
更迷惑???
那只是把onclose事件关联上而已
要想阻塞可以用ioctrl等来设这
这样是不会阻塞的
那只是把onclose事件关联上而已
要想阻塞可以用ioctrl等来设这
[/Quote]修改如下:
void CServeDlg::OnButton2()
{
CAsyncSocket m_sockRecv;
m_sockRecv.Create(5801,SOCK_DGRAM, FD_CLOSE,"127.0.0.1"); m_sockRecv.Bind(5801,"127.0.0.1");
m_sockRecv.Listen(2);
DWORD arg=0;
m_sockRecv.IOCtl(FIONBIO,&arg); char szRecv[20];
CString szIP("127.0.0.1");
UINT uPort=5800;
int iRecv=this->m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); AfxMessageBox("error");
}请问如上设置怎还是显示 AfxMessageBox("error");
不显示都难;
int iRecv=this->m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); 这一句中的RecvFrom不是阻塞的吗???
CAsyncSocket m_sockRecv;
m_sockRecv.Create(5801,SOCK_DGRAM, FD_CLOSE,"127.0.0.1");
this->m_sockRecv.Bind(5801,"127.0.0.1");
m_sockRecv.AsyncSelect(0);
DWORD arg=0;
m_sockRecv.IOCtl(FIONBIO,&arg); //此3行代码设置为阻塞模式char szRecv[20];
CString szIP("127.0.0.1");
memset(szRecv,'\0',20);
UINT uPort=5800;
int iRecv=m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0); AfxMessageBox("OK!");