为了账号安全,请及时绑定邮箱和手机立即绑定

请问在vc socket中,有什么办法可以让recv返回0值吗?

请问在vc socket中,有什么办法可以让recv返回0值吗?

C C++
波斯汪 2021-11-03 11:07:45
一个阻塞的tcp/ip文件传输程序,当我发送端read()为0时退出发送函数模块,send()函数也正常返回0了,但是接收端一定要等到发送端的closesocket()函数运行完之后recv()函数才返回0,否则就一直卡在recv()那里。求用什么办法可以在不关闭接收端socket的情况下recv正常返回0好让我的程序正常退出?我做一个多文件的网络传输,用阻塞式的TCP/IP套接字,请问怎么用select()函数判断每次发完一个文件再发另外一个?现在的问题很令人痛苦,接收端每次都不能正常返回,要不然就是recv()卡住,要不然就是send那边把其他文件的字节也传到recv端第一个文件里面。
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

首先可以将RECV函数设置为非阻塞模式。这个就不多说了。
对于另一个问题,发送端每次发送的字节数要和接收端每次接收的内容大小一致。比如接收端每次收4K,发送端也必须是每次发4K,如果发送的内容实际小于4K,就用空字符补。

查看完整回答
反对 回复 2021-11-07
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

你可以用异步的IO模式,比如select模式,overlappped模式,事件模式,甚至IOCP。这样就不会存在recv被卡住的问题了,性能也极大的提高。
同步的recv返回0,表示连接正常关闭, 你想让recv返回0却保持连接这是很难的。

查看完整回答
反对 回复 2021-11-07
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

用select测试.
select功能很强, 但用起来有点复杂, 很多人说它不好用, 其实是不会用, 希望你别说它不好用.
======================================================
不论是不是Blocking模式, select都可以用来检测:
1)连接是否成功;
2)是不是可以发送;
3)是不是可以接收;
4)对方是否断开连接

=====================================================
"send那边把其他文件的字节也传到recv端第一个文件里"
你的程序设计的问题, 和socket怎么用无关.



查看完整回答
反对 回复 2021-11-07
  • 3 回答
  • 0 关注
  • 402 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信