Chinaunix

标题: 请教一个关于接收网络数据的问题 [打印本页]

作者: sillydog825    时间: 2006-07-13 09:50
标题: 请教一个关于接收网络数据的问题
发送方先发一个字节,再发几个字节,在windows上用CSocket的OnRecieve虚函数可以一次接收这两次发

送的数据,在linux上则有时要调用两次recv,请问linux下有没有提供象windows的消息机制来实现异步

I/O?

谢谢!
作者: kuaizaifeng    时间: 2006-07-13 10:33
没有用过windows下的socket
不过考虑一个极端的情况,发送方在第一次发送了一个字节后,隔一天再发送第二批数据
windows下的OnRecieve虚函数也可以一次接收????

个人觉得数据是一次接收完还是分几次接收完和操作系统没有关系,而是跟当时的网络负载有关系

请高手指点
作者: sillydog825    时间: 2006-07-16 11:28
这两个包是顺序发出的中间有一小段代码。我是在局域网上做的,相同的条件下,使用windows的消息机制一次可以收两包数据,在linux如果设置延时也可以收两包数据,但直接用recv就只能收到第一个包数据。想知道linux下有没有类似windows的发生网络事件用消息通知的机制,是不是用信号?谢谢
作者: liubinbj    时间: 2006-07-16 11:49
CSocket封装了一个不可见窗口,利用窗口的消息机制来实现事件通知,这种封装不是windows的内容,是MFC类库的内容,标准c++没有这种类似封装,不过有些类库实现了相似的功能,如wxWidgets。一次收多少数据包根本不用理会,没有意义。
作者: sillydog825    时间: 2006-07-16 12:33
MFC封装的是windows API WSAAsyncSelect。请问linux的底层用哪个API能实现类似功能?
作者: cmh_2003    时间: 2006-07-16 12:37
即使只在windows下也别用vc的类,都用函数各写一个连接,几乎都一样.windows下多了个ws..?那么一个声明 用closesocket关句柄 其他都一样
作者: sillydog825    时间: 2006-07-17 07:00
搞了几天了,也没有找到解决方案,要疯了,高人指点一下吧
作者: playmud    时间: 2006-07-17 08:28
没看出来哪里有问题了,linux下面有select和epoll等机制通知你数据来啦。
作者: JohnBull    时间: 2006-07-17 10:50
原帖由 sillydog825 于 2006-7-13 09:50 发表
发送方先发一个字节,再发几个字节,在windows上用CSocket的OnRecieve虚函数可以一次接收这两次发

送的数据,在linux上则有时要调用两次recv,请问linux下有没有提供象windows的消息机制来实现异步

I/O?
...


流式套接字,一次收还是两次收有区别吗???????

如果你的程序不能兼容多次收到的话,你的程序就是错误的。
作者: sillydog825    时间: 2006-07-18 11:26
现在找到一个用信号的方案来获得数据到达的通知,就是先挂上信号处理程序,再将socket设非阻塞方式,然后在信号处理程序中接收数据。可是发送较大量数据的时候,信号好象会丢失,数据实际止都到了,但给的信号不够,导致最后数据收不完全,唉。。。
用select 和poll都是一种被动的方式,那样根本无法区别是对方不发数据了还是连接异常断开这种情况,最郁闷的是超时不好设置

[ 本帖最后由 sillydog825 于 2006-7-18 11:28 编辑 ]
作者: liubinbj    时间: 2006-07-18 11:29
原帖由 sillydog825 于 2006-7-18 11:26 发表
现在找到一个用信号的方案来获得数据到达的通知,可是发送较大量数据的时候,信号好象会丢失,数据实际止都到了,但给的信号不够,导致最后数据收不完全,唉。。。
用select 和poll都是一种被动的方式,那样根本 ...


不要把windows下的理念带到linux里来,而且信号和消息是不同的,重复信号被丢了。
作者: frstq    时间: 2006-07-18 11:46
原帖由 sillydog825 于 2006-7-18 11:26 发表
现在找到一个用信号的方案来获得数据到达的通知,就是先挂上信号处理程序,再将socket设非阻塞方式,然后在信号处理程序中接收数据。可是发送较大量数据的时候,信号好象会丢失,数据实际止都到了,但给的信号不够 ...

1)再将socket设非阻塞方式可以解决这个问题.你好好看看就知道了.确认对方什么时候数据发送完,可以是本地什么时候收到对方的FIN,结合shutdown()函数和select的超时设置可以解决.
2)异常断开,可用TCP带外数据结合SIGURG写个心博函数解决.
作者: sillydog825    时间: 2006-07-18 12:45
谢谢楼上的
心博函数是什么?是字打错了?信号处理函数吗?
作者: linxd0726    时间: 2006-07-18 13:07
信号是不安全的,建议最好少用,尤其是关键操作

网络接收数据一般都用selct,设置一个超时,个人感觉没有必要区别是对方不发数据了还是连接异常断开,或是否一次接收对方n次发送的数据,只要超时就关闭连接,进行下一次监听,网络接收数据发生异常是很正常的,关键是客户端应该有重发的机制,还有就是超时要设置合理,各服务和客户端要配合起来,这是个人的一点见解,不对的地方请大家指正
作者: sillydog825    时间: 2006-07-18 17:21
原帖由 linxd0726 于 2006-7-18 13:07 发表
信号是不安全的,建议最好少用,尤其是关键操作

网络接收数据一般都用selct,设置一个超时,个人感觉没有必要区别是对方不发数据了还是连接异常断开,或是否一次接收对方n次发送的数据,只要超时就关闭连接,进行下一 ...


说得对,下午已经决定不用信号了。还是用select保险。内核发出来的信号简直没谱。一会多一会少,数据读完了还有信号,真晕。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2