小女子有个弱弱的问题要请教各位网络高手
UDP组播程序设置了WSAAsyncSelect函数,在本地主机运行后第一次可以接收FD_WRITE,发送数据时也可以接收FD_READ,但是以后发送数据时本地主机就不能接收这些信息了。可是同时在别的机子上倒是可以接收FD_READ消息然后读取数据。是不是和本地socket的缓冲区有关?望请各位高手指点迷津。 问题点数:20、回复次数:12Top
1 楼kange2001()回复于 2005-05-02 00:43:17 得分 0
就是这个问题,呵呵,用的是同一个代码啊http://search.csdn.net/Expert/topic/2502/2502480.xml?temp=.7334406Top
2 楼krh2001(边城浪子)回复于 2005-05-02 01:15:38 得分 3
每次接收完成后都
WSAAsyncSelect(FD_READ);Top
3 楼nuaawenlin(飘人)回复于 2005-05-02 09:20:44 得分 3
其实问题出现在
如果此次的数据到达时,你没有投递recv,那么消息就被阻塞了,直到你投递recv为止
如果数据交换频繁的话,WSAAsyncSelect模型就不适合了Top
4 楼kange2001()回复于 2005-05-02 23:34:43 得分 0
krh2001(边城浪子) :我试过了,在接收完后用WSAAsyncSelect(FD_READ|FD_WRITE);是不发FD_READ消息的,但发送的是FD_WRITE消息,说明缓冲区有空闲。可问题仍然存在啊!不过这种方法讨巧,符合我的风格,呵呵!
nuaawenlin(飘人) :如果用WSAAsyncSelect不就是设置套接字为非阻塞吗?不才问一句,WSAAsyncSelect不合适的话,那是不是用WSAEventSelect?Top
5 楼kange2001()回复于 2005-05-02 23:37:30 得分 0
两位好心人,我给你们留言了哦!希望你们看得到~~Top
6 楼krh2001(边城浪子)回复于 2005-05-02 23:44:39 得分 3
我看到了. 我偶尔也会用一下 ,不过也没有发现过这样的问题.
在大多数时候我都会使用 SOCKET API + 线程 来处理. 我个人感觉无论是性能, 兼容性,都比 WIN SOCKET 要好, SELECT 模型也是非常灵活的.. 呵呵Top
7 楼SmallBigCat(乱花渐欲迷人眼)回复于 2005-05-05 23:11:49 得分 3
在发送、接收失败(返回SOCKET_ERROR)后需要调用WSAAsyncSelect(...)一次;Top
8 楼kange2001()回复于 2005-05-07 12:58:25 得分 0
问题是发送接收都是成功的,我用WSAGetLastError()查过。Top
9 楼krh2001(边城浪子)回复于 2005-05-07 13:07:52 得分 4
成功了也要再次
WSAAsyncSelect(FD_READ);Top
10 楼nuaawenlin(飘人)回复于 2005-05-07 15:50:19 得分 4
再次投递
不过还是建议使用多线程Top
11 楼kange2001()回复于 2005-05-08 21:30:35 得分 0
呵呵,感谢各位出谋划策,不过最终问题不在这哦!只要将源程序中WSARecvFrom的源地址换成一个空地址,而不是组播地址就可以了。源程序另外一个问题就是将WSAJoinLeaf中后面第五个参数设为NULL,因为据说目前windows平台没有支持的。希望我这个帖能够给以后调试这个程序的同僚们有点帮助。这个程序是《Visual C++网络通信编程实用案例精选》中broadcast的源程序,网上可以下载。另外《windows网络编程》(求是科技的,黄超编著)中也用到了这个源代码,错误是一样的。Top
12 楼bochs()回复于 2005-05-09 00:10:19 得分 0
我的EMAIL:taijils@yahoo.com.cn
联系我吧。Top




