CSocket类的Send()函数问题:连续发送多次为什么只收到一次?
我建立了服务器端和客户端,打算仿QQ的在线人员:用户a上线,然后b上线,这时服务器端把所有在线人(只有a)的信息传给b,再把b的信息传给所有在线人(这里只有a),成功--...
我建立了服务器端和客户端,打算仿QQ的在线人员:用户a上线,然后b上线,这时服务器端把所有在线人(只有a)的信息传给b,再把b的信息传给所有在线人(这里只有a),成功--a看到了b,b也看到了a.
但接下来,c上线了.结果c只收到一个人在线的信息。为什么?我用for循环的方式把在线的信息Send()给c,结果,我发现,Send两次以上就不行,该如何才行?
我好像知道点什么了,有人说我的虽然多次send,但一次receive就把两次send都接收了,是这样吗?还说第二次接收的是在缓冲区里?哪个缓冲区?是receive(char *buf,num)中的那个buf中吗?还是在别的地方? 展开
但接下来,c上线了.结果c只收到一个人在线的信息。为什么?我用for循环的方式把在线的信息Send()给c,结果,我发现,Send两次以上就不行,该如何才行?
我好像知道点什么了,有人说我的虽然多次send,但一次receive就把两次send都接收了,是这样吗?还说第二次接收的是在缓冲区里?哪个缓冲区?是receive(char *buf,num)中的那个buf中吗?还是在别的地方? 展开
2个回答
展开全部
楼主可能没搞清楚,当每个socket建立后会有一个发送缓冲区和一个接收缓冲区,windows系统默认是8KB,send调用成功以后数据并没有立即发出去,而只是把发送的数据复制到发送缓冲区,由操作系统底层实现发送功能,发送到接受端的接收缓冲区。为了减轻网络负担,一般的TCP链接用了nagle算法,并不是发送缓冲区有数据就会发送的。
对于接收端来说,receive(char *buf,num)只是从接收缓冲区里面取数据,返回的值就是取得的数据大小。你多次send,如果数据量不大,而num的值超过了发送的总值,那么就会一次取完接受缓冲区的数据。
不知道这样解释楼主清楚了没有。
对于接收端来说,receive(char *buf,num)只是从接收缓冲区里面取数据,返回的值就是取得的数据大小。你多次send,如果数据量不大,而num的值超过了发送的总值,那么就会一次取完接受缓冲区的数据。
不知道这样解释楼主清楚了没有。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询