关于send的问题

SeekInRain 2000-08-18 01:44:00
客户机与服务器之间用sock_stream传送文件,把send放在读文件循环中,也就是用readfile读完, 就将buffer中的数据用send发送出去, 这个循环的速度很快, 接收文件那一端是否来得及接收?? 可不可以在发送前阻塞一下, 并检测是否可以继续发送.如可以的话, 就继续发送, 否则就继续阻塞. 怎样实现????

...全文
207 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzh 2000-08-19
  • 打赏
  • 举报
回复
其实没必要这样的。你可以从CAsyncSocket派生一个类,用它的Send来发送数据,然后再判断Send的返回值,如果返回值等于发送的实际字节数,表明发送成功,可以进行下一次发送,如果实际发送字节数小于缓冲区中数据,下一次就发送末完成的任务,直到发送完成。如果返回SOCKET_ERROR,可以用GetLastError()来获取错误信息。只要成功发送出去了,接收方就一定能收到。这是由操作系统决定的。当然,你得用流方式。
SeekInRain 2000-08-19
  • 打赏
  • 举报
回复
borz说的对, 我也是这么做的. 发送方send后, 立即recv, 等待接收方的回应, 而接收方收到发送方的数据后, 立即send, 前面因为recv而阻塞的发送方因为收到接收方发来的数据, 进程便可继续下去, 也不太会发生发送方发出的数据接收方来不及收. 如果大家还有什么更好的办法, 不吝赐教.(请别用mfc~~~~~~~~~~~~)
borz 2000-08-18
  • 打赏
  • 举报
回复
分块发送(大小视情况而定)
接收那一端:收到一个块后,写一个字节
发送那一端:发送一个块后,读一个字节
这样就可以相互依赖了,而不会因为一方发送了而另一方还没接收完
lazybug 2000-08-18
  • 打赏
  • 举报
回复
当网络速度比较慢或对方接收速度慢或系统的发送缓冲区已满,
send会发不出去,从send返回的结果可以看出;
最好在send前判断当前socket是否可写,这样便于控制程序。
kingwill 2000-08-18
  • 打赏
  • 举报
回复
我们都碰上了同样的问题。你做的是什么啊?和我的很象吗!
不知道你用的是什么类,如果是CSOCKET的话,你就不用担心对方会不会来得及收到,因为这个类是阻塞的,直到对方完全接到信息。此时你要注意,如果这样的话,如果一个用户阻塞的话,你的整个线程就会阻塞,其他任何程序都被挤掉。所以,一定要设TIMEOUT。
如果你用的是CASYNCSOCKET类的话,它是非阻塞的,也就是他回在将要阻塞时返回一个值,把控制权交还给你,不会霸占线程。你只要控制一下重发就可以了,一般来讲,发两次就可以了。
其实,SOCKET编程最好的是用SDK来写,效率高。而且它是非阻塞的。
Sniper 2000-08-18
  • 打赏
  • 举报
回复
没有试过。我想在两次Send中加个延时应该就可以了吧。

4,354

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧