我的一个程序用了WSAEventSelect,模型,发现无法正常工作:
我的Event是用WSACreateEvent建立的,步骤如下:
1、WSAEventSelect(m_hSocket,m_hWaitEvents[0],FD_WRITE | FD_CLOSE)选择事件,
2、WSAWaitForMultipleEvents(sizeof(m_hWaitEvents)/sizeof(HANDLE), m_hWaitEvents,FALSE,m_dwTimeout,FALSE);等待事件
3、WSAEnumNetworkEvents(m_hSocket,m_hWaitEvents[0],&we);判断事件类型
4、send(m_hSocket,(const char *)pData+nSentSize,nSize-nSentSize,0);发送数据
然后我发现下一轮中与Socket相关联的Event再也无法被激活了,非常奇怪!谁能告诉我是那里出了问题啊!急!谢谢了!
我的Event是用WSACreateEvent建立的,步骤如下:
1、WSAEventSelect(m_hSocket,m_hWaitEvents[0],FD_WRITE | FD_CLOSE)选择事件,
2、WSAWaitForMultipleEvents(sizeof(m_hWaitEvents)/sizeof(HANDLE), m_hWaitEvents,FALSE,m_dwTimeout,FALSE);等待事件
3、WSAEnumNetworkEvents(m_hSocket,m_hWaitEvents[0],&we);判断事件类型
4、send(m_hSocket,(const char *)pData+nSentSize,nSize-nSentSize,0);发送数据
然后我发现下一轮中与Socket相关联的Event再也无法被激活了,非常奇怪!谁能告诉我是那里出了问题啊!急!谢谢了!
http://expert.csdn.net/Expert/topic/1172/1172287.xml?temp=.8762781
m_hEvent1,
FD_CONNECT|FD_CLOSE|FD_READ);
第三个不是可以设置网络事件吗?不要设FD_WRITE就行了
这么说我在没有收到WSAEWOULDBLOCK前一直可以发数据?那返回WSAEWOULDBLOCK的那次操作数据会不会发出去?我试过好像是没有发出去。另外有一个百思不得其解的问题,就是socket的发送缓冲区。MSDN说对于异步socket的send如果成功的话,返回值为1-max bytes之间,既然这样,我自然就靠send的返回值来分包了,所以对于传入send的数据大小我并没有限制,结果发现当我发一个16M的数据包时(我用的是内存映射文件的指针),send的返回值居然也是16M,我总觉的这是不可能的事情。系统分配给socket的发送缓冲区我记得就8K,他怎么可能把16M的数据全拷到缓冲里,但事实是send确实很快就返回了,而且对方确实也能收到数据(局域网),谁能帮我解释一下?
你说的是TCP层的,我说的是socket层的,两回事。socket还可以不设缓冲,TCP层总不能没有缓冲吧。tcp给自己分配空间总有个限度吧?我如果很多socket同时发送16M的数据包,难道他还都满足啊?To:ttzzgg_80713(别欺侮我)
WSAEnumNetworkEvents就有reset的功能了。我的园子早停了,现在虽然也有宽带,不过机子上装的是professional,没法运行SQL和正规的IIS
将一个套接字置为非锁定模式之后,WINSOCK API调用会立即返回。在大多数情况下,这些调用都会“失败”,并返回一个WSAWOULDBLOCK错误。什么意思呢?它意味着请求的操作在调用期间没有时间完成。又:若应用程序针对一个套接字调用了WSAASYNCSELECT,那么套接字的模式会从“锁定”自动变成非锁定。
那么短的时间不可能全发出去的,我用的是10M网,16M的数据不可能在不到1秒的时间内全部发送出去。而且send返回的也不是什么WSAWOULDBLOCK,而是那16M数据的大小 !!
当你用send发送数据时,winsock dll会新建一个thread为你进行数据的发送操作,一次把16M的数据投到send里头,thread就会一点点的慢慢发,但send就马上返回,如果你再一次send的话,应该你会收到WSAWOULDBLOCK的错误,因为winsock(不是TCP/IP传输层)的thread还没发完啊,发完后才会收到FD_WRITE。
在用DEBUG版本的程序结束运行后没发现在output里的thread exit code 多了好几个吗?
关于JJONY() 的猜测:当你用send发送数据时,winsock dll会新建一个thread为你进行数据的发送操作。socket应该不会再去建线程了吧?那样一个send还要再建一个线程开销太大了,不过系统应该是把它放到一个缓冲里了,我很奇怪系统为什么要这么处理