解决方案 »
- 大家平时编程是用普通SDK还是MFC的
- 关于rc文件中多余资源如何删除的问题
- 动态创建的edit控件,如何添加WM_KILLFOCUS消息响应函数?
- 如何用OpenMP实现FFT按时间基2抽取算法
- VC调用VB的ACTIVE dll控件。在线急等,高手帮忙!!!!!
- vc里通过webbrowser控件打开一个网页,通过代码填写表单的内容,对于文件上传的选择框,如何填写?痛苦啊,请高人指点!!
- 请问各位高手,像msn一样在窗口右下角的提示框怎么做呀!
- 协议的组成?
- 为什么在终止线程之后的便历ftp目录出错?(详情请进)
- 高分求用SDK写的截取键盘输入的源码!(用HOOK和SDK),谢谢~
- MFC 如何得到局域网中运行相应程序的所有客户端IP地址
- TCP_TABLE_CLASS问题
举个列子,比如我每次使用临时变量或全局变量buf[1024]来发送数据,那发生WSA_IO_PENDING的时候,我那变量里面的内容是不是会丢弃掉。
应该在FD_WRITE中发生数据case FD_WRITE: // 可以发送数据了 { // 进入无限循环 while(TRUE) { // 从文件中读取数据, 保存到 packet.data 里面. in.read((char*)&packet.data, MAX_PACKET_SIZE); // 发送数据 if (send(wparam, (char*)(&packet), sizeof(PACKET), 0) == SOCKET_ERROR) { if (WSAGetLastError() == WSAEWOULDBLOCK) { // 发送缓冲区已经满了, 退出循环. break; } else // 其他错误 { // 显示出错信息然后退出. CleanUp(); return(0); } } } } break;
while(true)
{
in.read((char*)&packet.data, MAX_PACKET_SIZE); //每次都更改packet内容
send(packet);//发生缓冲区满,此时packet中的内容会拷贝到socket缓冲区?
}
如果是WSA_IO_PENDING说明已经成功的复制到缓冲区,发送会在稍后完成
如果WSAEWOULDBLOCK,则说明已经满了,没有拷贝到缓冲区。则要等待一段时间再发送纠正一下前面说的2 如果我调用WSASend(),并返回了WSA_IO_PENDING,那我马上又调用一次WSASend(),那会同样返回WSA_IO_PENDING吗?如果缓冲区没有满,则是的。一般情况下发送不会失败也谢谢LZ,很多东西我也更清晰了
如果没有发送完,缓存就不释放,开发者需要保证缓存的有效性;按照我的猜测,你的代码不会返回WSA_IO_PENDING,原因是:
如果你使用重叠IO,那根本不用什么WSAEventSelect模型;
如果你用WSAEventSelect模型,那你的WSASend最后两个参数应该是NULL,此时如果你的套接字是阻塞的,那么WSASend要一直阻塞直到发送完成,如果是非阻塞的,那就会马上返回,并且至少发送了部分数据(因为你既然用了WSAEventSelect模型,那么在WSASend的时候,一定是可写状态)。所以,数据总是会发完的,不会像你说的,每次都返回WSA_IO_PENDING(其实不会返回WSA_IO_PENDING,这里我理解为返回无法发送——套接字缓存满),它总是趋向于发送完成的。