1、不知道要检测CSocket哪些状态?
2、用什么函数检检测?
2、用什么函数检检测?
解决方案 »
- 用户界面UI线程和工作者线程到底有什么区别啊?
- 登录窗口,主窗口是,当前窗口,这样写代码后,关了win_p1窗口后,当前窗口不会自动关掉,怎么才可以关win_p1关的时候,当前窗口也关掉啊?
- 100分求有关浏览路径对话框的问题
- 图像采集capSetVideoFormat
- 进来看一下,相当于送分呀,只是求一个_bstr_t字符串。。。。。。。在线等了。。。。
- 怎么样获取context menu的句柄/?
- C++动态创建对象问题
- 怎样在DLL中使用串口控件MSCOMM,SOS!
- 一个简单问题:马上结帖
- 有偿求一个VC#的网页自动登录小程序,可Q我1277743277,详谈
- 请问如何用VC++程序操作注册表(创建,修改,删除 主键和各类键值)
- 为什么进程中出现了,但却看不到执行结果(画面)呢??看一下,就给分(100)
在nRead=Receive(rBuf,SEND_BYTES);与GetLastError之后调用AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE );
一般TCP协议都是这么做的。
可能没有把问题说清楚。比如服务器一下要发131072数据给我,而我在CSocket->OnReceive时调用CSocket->Receive只是收1024,其余的让系统自己再触发CSocket->OnReceive,我再收1024,这样循环把数据接收完。这样的数据接收是否正确?以下是我的理解,不知对不对:
以下指是描述意思,不拘细节:
当131072数据被客户端接收时,存在客户端的接收缓冲区中,
系统发现接收缓冲区有了新数据,可以被客户端程序接收,
于是它查看用户是否想得到“有新数据可接受”的消息通知,
如果,用户想得到这一通知,就通知该用户。通知方式是OnRecv被调用。
用户此时可以接收数据到自己指定的内存。
那末,系统如何知道用户想不想得到该通知呢?如果用户调用了
AsyncSelect( FD_READ);系统就知道用户想的到该通知。
而这一步是异步套接字类构造时自动做了的。但是,如果,客户端在一次OnRecv中只Recv了1024,剩下的数据仍在接受缓冲区中,在下一次服务端发送131072数据(实际上发不了那末多)时,系统发现又接受了新数据,会再次调用OnRecv.
而在此之前,系统不会再自动检查接受缓冲区是否还有数据待接受,也就不会调用OnRecv.
这时,
一种方法是在OnRecv中不断调用Recv,但是缺点是就不再异步了,因为可能接受指定的长度的数据有的Recv会阻塞住,因为数据未达到那莫长。
一种方法是WSAIoctl以FIONREAD参数查看接受缓冲区内还有多少数据可接受,之后只接受该长度的数据。但缺点是有时数据长度可能不正确。
一种方法是自行调用AsyncSelect( FD_READ);命令系统这时检查接受缓冲区内是否还有数据,如果有,系统又会再调用OnRecv。这里注意的是异步套接字在调用AsyncSelect时一次应将所有要接受的事件类型同时设置。因为后一次调用时会替换原来的设置。所以调用
AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE );也不知对不对,自己试试。
我用Recv接受数据时出现过一个奇怪的错误:
我是用循环一次接受完所有数据。时而会出现死机或好长时间无响应(5-10分钟)不知为何?
客户端发了信息了,但是我的程序就是没有运行到OnReceive中去了
到底怎么回事哑!!!!