一个阻塞的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,就用空字符补。
繁星点点滴滴
TA贡献1803条经验 获得超3个赞
你可以用异步的IO模式,比如select模式,overlappped模式,事件模式,甚至IOCP。这样就不会存在recv被卡住的问题了,性能也极大的提高。
同步的recv返回0,表示连接正常关闭, 你想让recv返回0却保持连接这是很难的。
汪汪一只猫
TA贡献1898条经验 获得超8个赞
用select测试.
select功能很强, 但用起来有点复杂, 很多人说它不好用, 其实是不会用, 希望你别说它不好用.
======================================================
不论是不是Blocking模式, select都可以用来检测:
1)连接是否成功;
2)是不是可以发送;
3)是不是可以接收;
4)对方是否断开连接
=====================================================
"send那边把其他文件的字节也传到recv端第一个文件里"
你的程序设计的问题, 和socket怎么用无关.
- 3 回答
- 0 关注
- 449 浏览
添加回答
举报
0/150
提交
取消