三、在应用中升级----网络编程部分

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">本次记录网络编程。</span>

使用的通信协议为TCP,方式为epoll方式。对于socket的基本知识不再记录,这里直接给出说明代码。

在进行网络编程时遇到一个问题,还不知道原因,函数代码如下:

int read_pack(int sockfd,void * buf,int len)
{
    if(buf==NULL||len<=0)
        return 0;

    int nleft;
    int nread, nwrite;
    char *ptr;
    long int offset = 0;
    
    ptr=(char *)buf;
    nleft = len;
    printf("nleft is :%d\n", nleft);
    while(nleft > 0)
    {
        printf("nleft is :%d\n", nleft);
        
        if((nread = recv(sockfd, &ptr[offset], nleft, 0)) < 0)//read返回错误
        {
            printf("Read ERROR\n");
            if(errno == EINTR)//是由于信号中断造成的读失败,则继续读
                 nread = 0;
            else//否则是真正的读错误,返回失败的标志
               return -1;
        }
        else if(nread == 0)//数据读取完毕了,到达了文件的末尾
            break;        
        nleft -= nread;//剩余要读取的
        offset += nread;//偏移缓冲区位置
        printf("nread is :%d\n", nread);
        /*if((nwrite = send(sockfd, "Next", 4, 0)) < 0)
        {
            printf("ERROR\n");
            break;      
        }*/      
    }
    printf("nleft is :%d\n", nleft);
    printf("Read over\n");
    return (len-nleft);
}
问题就是上面的recv读函数,假如数据已经读完了,但是还未判断nread的值所以还不能跳出循环,于是又读了一次,因为已经读完数据,所以这次读数据返回的nread值应该是0,可是实际上是,读的时候死在那里了。

多方面思考我想是不是recv函数在等待服务端发送的数据,阻塞在那里了。不太明白,还需要跟踪一下源码。


但是如果在服务端指定了文件的大小,而且客户端也已经知道要接收的文件大小的话,就没有问题了。

因此我想服务端在发送具体文件数据前,先通知客户端,下面将要发送文件的大小信息,于是定义一个下面的结构体:

typedef struct{
    char file_name;//文件名字
    long int file_size;//文件的大小
    long int complete_block;//记录file_name该文件已经传送完成的数据
}file_info;
用上面这个结构体来标示文件的相关信息。

测试调试一下。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值