returningprodigal 2018-01-06 04:41 采纳率: 50%
浏览 2202
已采纳

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);
} 
  • 写回答

5条回答 默认 最新

  • BasicTheory 2018-01-06 09:19
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?