我正在处理基于newtwork事件的套接字应用程序。
当客户端发送了一些数据,并且在套接字上有东西需要读取时,FD_READnetworking事件就会生成。
现在根据我的理解,当服务器想要写套接字,必须有一个事件产生,即FD_WRITE。 但是如何产生这个消息呢?
当有些东西可以读取时,FD_READ是自动生成的,但是当服务器想写什么的时候FD_WRITE是什么?
助记符button点击一个button的点击事件,但它不发射文本框的离开事件
可以使用primefaces<bool>进行multithreading同步而不是事件
Winsock接受事件有时会停止信号(WSAEventSelect)
如何在Windows上使用Python生成密钥保存和按下事件
水平边缘滚动(在Linux中)Tkinter事件是什么?
任何人可以帮我解决这个困惑吗?
以下是代码片段:
WSAEVENT hEvent = WSACreateEvent(); WSANETWORKEVENTS events; WSAEventSelect(newSocketIdentifier,hEvent,FD_READ | FD_WRITE); while(1) { //while(1) starts waitRet = WSAWaitForMultipleEvents(1,&hEvent,FALSE,WSA_INFINITE,FALSE); //WSAResetEvent(hEvent); if(WSAEnumNetworkEvents(newSocketIdentifier,&events) == SOCKET_ERROR) { //Failure } else { //else event occurred starts if(events.lNetworkEvents & FD_READ) { //recvfrom() } if(events.lNetworkEvents & FD_WRITE) { //sendto() } } }
用inotify处理预先存在的文件
在Visual C ++ MFC中启动窗口时的事件顺序
填充Windows XP安全事件日志
如何判断Win32_NTLogEvent InsertionString是否存在?
FD_WRITE表示您可以立即写入套接字。 如果发送缓冲区已满(您发送数据的速度比在网络上发送的速度还要快),那么在您等待一段时间之后,最终您将无法再写入数据。
一旦写入失败,由于缓冲区已满,此消息将发送给您,让您知道您可以重试发送。
当你第一次打开socket时,它也被发送,让你知道它在那里,你可以开始写。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms741576(v=vs.85).aspx
FD_WRITE网络事件处理稍有不同。 当套接字第一次连接到对connect,ConnectEx,WSAConnect,WSAConnectByList或WSAConnectByName函数的调用时,或者在使用accept,AcceptEx或WSAAccept函数接受套接字,然后发送失败并使用WSAEWOULDBLOCK时,将记录FD_WRITE网络事件并且缓冲区空间变得可用。 因此,应用程序可以假设从第一个FD_WRITE网络事件设置开始发送,直到发送返回WSAEWOULDBLOCK。 发生这种故障后,应用程序将会发现在记录FD_WRITE网络事件并设置相关的事件对象时,发送也是可能的。
所以,理想情况下,您现在可能会保持一个标志,是否可以写入。 它从真正开始,但是最终在调用sendto的时候会得到一个WSAEWOULDBLOCK,并将其设置为false。 一旦收到FD_WRITE,您将标志设置为true并恢复发送数据包。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。