- 论坛徽章:
- 0
|
用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
但都不解决问题。
有谁知道怎么回事的,帮忙解答一下,谢谢。 |
|