面试题,新鲜出炉,socket的,进者有分!

chary8088 2011-12-26 03:15:02
1 怎么检测socket是不是断开了?
2 按顺序发送出去的数据包,在接收时顺序乱了,是什么原因导致的?
3 如果发送100K的数据,第一次发送了50K,然后不能发送了,剩下的50K怎么办?

我回答:
1 超时检测,比如发送超时,接收超时
2 如果是tcp,应该是tcp重传造成的,比如第一次发送失败,然后重传造成的
UDP很可能就是前一个包延迟造成的
3 尝试发,好像不对

我不知道我的回答对不对,请大家讨论!
...全文
979 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
xengine-qyt 2012-01-05
  • 打赏
  • 举报
回复
简单,第二题很明显你打错了!
helloboy1991 2012-01-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 jsyren 的回复:]

1,心跳包
2,如果用tcp,顺序不是你的程序来考虑的问题。
3,如果是传了50k,剩下的50k可以下次再传嘛,只是记录一下这次传到了哪里就可以了。。。
这就是传说中的断点续传嘛


呵呵
[/Quote]
就是这样
面包大师 2012-01-05
  • 打赏
  • 举报
回复
只知有心跳。。。
smwhotjay 2012-01-05
  • 打赏
  • 举报
回复
1.其实不仅可以心跳. 心跳只是下策. select之.解决
2.接收时顺序乱. tcp是不可能的.除非你发送出错了.或中间网络层或其他层转发出现问题.
sharptiger123 2011-12-31
  • 打赏
  • 举报
回复
写个配置文件分块断点续传
jsyren 2011-12-29
  • 打赏
  • 举报
回复
1,心跳包
2,如果用tcp,顺序不是你的程序来考虑的问题。
3,如果是传了50k,剩下的50k可以下次再传嘛,只是记录一下这次传到了哪里就可以了。。。
这就是传说中的断点续传嘛


呵呵
xqlu2007 2011-12-27
  • 打赏
  • 举报
回复
3.后面的50K发不了,说明前面的50K发出去没收到应答,即前面的都还没发成功,所以只能等,等的结果是超时或等了一段时间后等到了应答,前者全部重发,后者正常发.
Eleven 2011-12-27
  • 打赏
  • 举报
回复
如果发送100K的数据,第一次发送了50K,然后不能发送了,剩下的50K怎么办?
------------------------
问题没有描述清楚,然后不能发送了?为什么不能发送,网络问题?还是send失败?还是系统缓冲区满~
Eleven 2011-12-27
  • 打赏
  • 举报
回复
如果发送100K的数据,第一次发送了50K,然后不能发送了,剩下的50K怎么办?
------------------------
问题没有描述清楚,然后不能发送了?为什么不能发送,网络问题?还是send失败?还是系统缓冲区满~
Eleven 2011-12-27
  • 打赏
  • 举报
回复
如果发送100K的数据,第一次发送了50K,然后不能发送了,剩下的50K怎么办?
------------------------
问题没有描述清楚,然后不能发送了?为什么不能发送,网络问题?还是send失败?还是系统缓冲区满~
oyljerry 2011-12-27
  • 打赏
  • 举报
回复
3.要么就是下次有机会重发,要么就是放弃这次发送
langyano1 2011-12-27
  • 打赏
  • 举报
回复
TOP
jxingcn 2011-12-27
  • 打赏
  • 举报
回复
1:可以自己写心跳包检查SOCKET连接是否有效
2:可以利用TCP自身的心跳包机制 SO_KEEPALIVE来判断SOCKET连接是否有效。
3: 如果是TCP,TCP底层会保证数据包按顺序接收。
4:如果发送100K的数据,第一次发送了50K,然后不能发送了,剩下的50K怎么办?如果SOCKET出错,那么后面50K就不发了,释放资源,关闭SOCKET。
96掌门师兄 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 morebread 的回复:]
1、判断socket api返回值并结合GetLastError来确定
2、每个包经过的路由是不同的,会造成到达时间的不同
3、问题看不明白,是问谁怎么办? 应该是直接丢弃吧,还能怎么办?
[/Quote]

3.和socket设置选项有关,如果有数据没发送完,直接丢弃吧。
csx007700 2011-12-26
  • 打赏
  • 举报
回复
1 怎么检测socket是不是断开了?

心跳包..... 肯定的...

2 按顺序发送出去的数据包,在接收时顺序乱了,是什么原因导致的?

发送过程中通过的路径不一样 导致到达时间不同

3 如果发送100K的数据,第一次发送了50K,然后不能发送了,剩下的50K怎么办?

不能发送了?不太懂耶... 那....只能丢了?
小麻侬 2011-12-26
  • 打赏
  • 举报
回复
1 心跳包,select机制
2 对于UDP,这种现象很常见,可以加索引,然后接收端设置缓存接收,按索引取
3 难道是要和你讨论类似断点续传
ouyh12345 2011-12-26
  • 打赏
  • 举报
回复
3、改成非阻塞模式,并循环发
chary8088 2011-12-26
  • 打赏
  • 举报
回复
没人了?
chary8088 2011-12-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 morebread 的回复:]

1、判断socket api返回值并结合GetLastError来确定
2、每个包经过的路由是不同的,会造成到达时间的不同
3、问题看不明白,是问谁怎么办? 应该是直接丢弃吧,还能怎么办?
[/Quote]

我估计意思是问怎么处理,我也没能真正体会到他问的真正意图
morebread 2011-12-26
  • 打赏
  • 举报
回复
1、判断socket api返回值并结合GetLastError来确定
2、每个包经过的路由是不同的,会造成到达时间的不同
3、问题看不明白,是问谁怎么办? 应该是直接丢弃吧,还能怎么办?
加载更多回复(1)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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