tcp大文件传输,全部write成功,read接收到部分后阻塞

tcp大文件传输,全部write成功,read接收到部分后阻塞。
小文件传输没问题。

 //传输数据结构体
typedef struct ResponeBody{
    int packindex;//4 byte
    char type;//2 byte
    char status;//2 byte
    int datalen;//4 byte
    int datatotal;//4 byte
    char s_arg[24];//24 byte
    char data[SIZE_DATA];
}ResponeBody;
//发送数据
 while((num = read(fd, resp.data, SIZE_DATA)) > 0)
{
    resp.type = getData;
    resp.status = 1;
    resp.datalen = num;
    res = my_write(socket, &resp, SIZE_RESP);
    if(res < 0){
        return -1;
    }
    memset(&resp, 0, SIZE_RESP);
}
close(fd);
//读取数据
int ret = -1;
while(1){
    num = read(socket, &resp, SIZE_RESP);
    if(num <= 0 || len_recv >= datatotal){
        printf("get success\n");
        ret = 0;
        break;
    }
    if(0 == resp.status || resp.type != getData){
        ret = -1;
        break;
    }
    write(fd, resp.data, resp.datalen);
    len_recv += num-SIZE_INFO;
    printf("get ----[%2.2f%%]----\n", len_recv/(double)datatotal * 100);
    memset(&resp, 0, SIZE_RESP);
} 

大文件只能分块传输,简单做法要有序的话,每次write之后清网络缓存,且标注发送结束标志等,接受就直接接收,正常来说一个自己的简单的网络传输要写一个你自己定的协议。

你这边write成功只是写入内核网络缓冲区里边,真正发送还要看网速实际环境,所以你看来卡了,但是估计你的实验是在本机发送和接收大文件,所以速度是网卡的理论速度100兆bit/s 但是还是会卡,网卡速度限制在这儿

http://bbs.csdn.net/topics/392306030?page=1

具体情况我还是不了解,不过这种问题首先需要检查下服务端是不是对数据包传送时间做了限制,
例如你如果用了weblogic服务器做服务端,应该检查下CompleteMessageTimeout参数,
这个参数数值范围是0-480秒,一般默认是60s,也就是数据传送1分钟就会超时断开。

大文件传输,做好的办法就是分片传输

可以参考一下tftp的传输过程,视要传输的文件大小,选择合适的切片,另外因为网络的原因,接收端可能存在收不全的情况,需要用一个简单协议标准来标注起始结束点