免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8534 | 回复: 5
打印 上一主题 下一主题

socket接收数据,但一次接收最大长度只有1376字节 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-21 20:29 |只看该作者 |倒序浏览
用c在linux下做个文件上传下载服务程序。用epoll监听连接。

连接后,新建的socket也用epoll监听传输来的数据。当接收到传输来特定命令字符(如提示接下来要上传文件了),把这个socket设为阻塞的,设置了收发超时。用一个线程处理这个socket。

线程流程中read这个socket,接收客户端发来的数据(2k一个数据包),并write回去确认信息。

现在发现,传来的2k数据,服务器要分两次read才能完成,第一次的read成功的长度,都是1376。如果文件结尾,不足1376长度,则一次性收完。

代码中,我对服务端、客户端的socket都设置了收发缓冲区大小,以客户端的delphi代码为例:

  var bufsize: integer;

  bufsize:=3000;
  setsockopt(basesock, SOL_SOCKET, SO_SNDBUF, PChar(@bufsize), sizeof(integer));   //设置发送缓冲区
  setsockopt(basesock, SOL_SOCKET, SO_RCVBUF, PChar(@bufsize), sizeof(integer));   //设置接收缓冲区

并且用如下命令对linux服务器作了设置(据说会设置socket缓冲区大小):
echo 63888 > /proc/sys/net/core/rmem_default
echo 511104 > /proc/sys/net/core/rmem_max
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling

但都不解决问题。

有谁知道怎么回事的,帮忙解答一下,谢谢。

论坛徽章:
0
2 [报告]
发表于 2008-08-21 20:32 |只看该作者
在链路层还有一个MTU,一般为1500.在那儿会分包,
你可以使用recv(sockfd, buf, size, MSG_WAITALL); 来接收, MSG_WAITALL表示接收到了这么多的数据才返回.

论坛徽章:
0
3 [报告]
发表于 2008-08-21 21:04 |只看该作者
看来是,该用recv而不用read,马上改。

论坛徽章:
0
4 [报告]
发表于 2008-08-21 21:11 |只看该作者
问题解决。谢谢scutan。


顺便请教一下:互联网环境下,做文件传输,分割成多大的数据包比较合理?

论坛徽章:
0
5 [报告]
发表于 2008-08-21 21:30 |只看该作者
原帖由 zhangfresh 于 2008-8-21 21:11 发表
问题解决。谢谢scutan。


顺便请教一下:互联网环境下,做文件传输,分割成多大的数据包比较合理?


以前在C版的时候, 思一克说过, 在发送端, 就将该发的数据一起发送过去, 在接收端进行接收, 同时通过某些协议来判断数据是否完全到达.

网络是分层的, 所以你在应用层发包的时候, 只需要考虑应用层如何来进行通信, 下面几层有下面几层的规则, 这些你不用管它.

论坛徽章:
0
6 [报告]
发表于 2008-08-21 22:28 |只看该作者
这样啊,那我考虑太多了

不过,我是要实现断点续传的,如果一次性传输所有的数据,传输过程中关闭客户端程序,服务程序可以正确接收已经到达服务端的数据吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP