关于WSAAsyncSelect 的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;
WSAAsyncSelect模型中,如果发送缓冲区可用的话,就会触发FD_WRITE消息。
问题是:如果上面代码中send返回WSAEWOULDBLOCK时,如果退出循环,就会执行到break语句。从而退出WSAAsyncSelect关联的线程函数。那么,上面这段代码也就没有机会再执行了。但是这时文件还没有发送完呀,如何才能使文件继续发送完呢?
...全文
相关推荐
WSAAsyncSelect模型示例源码
- 连接服务器,监听FD_CONNECT、FD_READ和FD_CLOSE事件。 - 接收FD_CONNECT消息,表示连接成功。 - 发送数据,监听FD_WRITE事件。
WSAASYNCSELECT模型-概述,Winsock I/O模型基础
- **FD_WRITE**:表示套接字已经准备好写操作。- **FD_ACCEPT**:表示新的连接请求已到达,可接受连接。- **FD_CLOSE**:表示套接字已关闭或错误发生。
WSAAsyncSelect()用法 vc
例如:```cpprc = WSAAsyncSelect(s, hWnd, wMsg, FD_READ | FD_WRITE);```取消所有事件通知,可以将`lEvent`设为0,这将使得Windows
WSAAsyncSelect客户端例子
在WSAAsyncSelect模式下,通常会在窗口消息处理函数中响应FD_READ或FD_WRITE事件来执行这些操作。7. **错误处理**:网络编程中,错误处理非常重要。
wsaasyncselect模型
**事件处理**:常见的WSAAsyncSelect可选事件包括FD_READ(数据可读)、FD_WRITE(可以写入)、FD_ACCEPT(有新的连接请求)和FD_CLOSE(连接关闭)。


