Chinaunix

标题: 一个socket问题 [打印本页]

作者: shute    时间: 2005-01-04 17:50
标题: 一个socket问题
我第一次写c++,实现一个服务是关于上传下载的。自己用windows api实现,现在有一个问题是我在本机上调试上传下载没有问题,但是当我分开在局域网两台机器上时,就会出错,我看了一下是server端循环发了几次(多于一次),但client接收次数不对,出现了丢失信息的情况。如果我在server发送前sleep一下就不会有问题,但这显然不是正确的方法,我该如何做呢????是不是setsockopt的那一项需要设置?希望赐教...
作者: flw    时间: 2005-01-04 18:24
标题: 一个socket问题
都没搞懂你用的是 TCP 还是 UDP
作者: yeath    时间: 2005-01-04 18:44
标题: 一个socket问题
肯定是TCP了,你的状况是发送端发送太快,接收端接收太慢造成的。
作者: assiss    时间: 2005-01-04 18:57
标题: 一个socket问题
[quote]原帖由 "yeath"]肯定是TCP了,你的状况是发送端发送太快,接收端接收太慢造成的。[/quote 发表:

TCP还用考虑这个问题吗?
作者: shute    时间: 2005-01-04 18:57
标题: 一个socket问题
肯定是TCP了,你的状况是发送端发送太快,接收端接收太慢造成的。

我也是这样考虑的,但不知该如何解决...
作者: 黄山松    时间: 2005-01-04 20:47
标题: 一个socket问题
应该是UDP,网络接收速度一般都要比发送速度慢的,所以,不要全速的发送数据,否则肯定会有问题!
作者: shute    时间: 2005-01-04 21:22
标题: 一个socket问题
我是tcp传送文件呀,为什么“TCP还用考虑这个问题吗?”????
我是这么创建的socket,socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )。谢谢...
作者: Moonwellatg4    时间: 2005-01-05 09:17
标题: 一个socket问题
对于连续的两次发送,另一个客户端可能会只收到合在一起的一串数据。
另外,一次发送的数据也可能会分成两次收到。

所以你应该这么做,在每个文件发送的最前面添加一个size字段,size字段后面跟着是数据内容。
作者: xtdwnuisea    时间: 2005-01-05 09:28
标题: 一个socket问题
Moonwellatg4  讲的很对,你收的时候代码呢?你最好以阻塞的方式,就省事了
作者: yeath    时间: 2005-01-05 14:40
标题: 一个socket问题
因为TCP是无保护消息边界的,不像是UDP协议。UDP协议一次发送对应接收端一次接收。
作者: shute    时间: 2005-01-05 17:15
标题: 一个socket问题
其实我发送的数据是一个struct,里面有一个length元素,还有一个字符串数组data[]。length用来存放data的长度,data是存放需要发送的数据的。我在本机测试传送没有问题,但把sever和client分成局域网中的两台机子就出问题了。 原因是客户端接收到server传过来的长文件的某一次send时,长度不够server传过来的长度。(例如server发送了1024个字节,而client只收到436字节,但是struct中的length确实是对的。)我想应该是server发送太快的问题,但能给个详细点的解决方案吗?
作者: 思一克    时间: 2005-01-05 17:26
标题: 一个socket问题
不需要你自己搞个length之类的。
作者: yuxh    时间: 2005-01-05 17:41
标题: 一个socket问题
[quote]原帖由 "shute"]例如server发送了1024个字节,而client只收到436字节,但是struct中的length确实是对的。[/quote 发表:

那就把剩下的收完,不然不错包了?
另外length如果是个int型的话会有字节序的问题




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2