实现游双《linux高性能服务器》书上代码碰到的一些问题(大文件传输)

在实现游双《linux高性能服务器》书中代码时,遇到包括根目录路径、调试困难和大文件传输问题。通过使用绝对路径解决根目录问题,借助GDB和日志定位多线程错误。针对大文件传输问题,原代码中bytes_to_send和bytes_have_send变量设置不当,修正后将它们设为类成员,并调整传输完成的判断条件,修复后的代码能够成功处理大文件传输。
摘要由CSDN通过智能技术生成

实现游双《linux高性能服务器》书上代码碰到的一些问题

第一个:网站的根目录,在代码中应该写绝对路径才行。

第二个:调试问题,由于没有日志系统,有很多输入错误但是没被编译器察觉的错误很容易发现不了。这个时候应该使用GBD进行多线程调试,配合printf或者打日志的办法定位到问题点,进行修改!

第三个:这个代码中跑起来实测不能进行大文件的传输,源代码问题如下:
问题在于bytes_to_send 和bytes_have_send记录文件传输进度的两个int变量的值未记录下需要传输文件的大小,传输文件完毕的判定(bytes_to_send <= bytes_have_send)也很迷,这两点导致了在传输大文件的时候会出现问题,目测只会传输报头大小的数据量?感觉是这样 没有具体测试。

//源代码:
bool http_conn::write()
{
   
    int temp = 0;
    int bytes_have_send = 0;//已经传过去的数据字节
    /*
         *
         *这里也应该在bytes_to_send 记录文件大小
         *此处没有记录文件大小,所以传输的时候不能判断什么时候文件传输完毕
         *
    */
    int bytes_to_send = m_write_idx;//还需传入的数据字节
    if(bytes_to_send == 0)
    {
   
        modfd(m_epollfd, m_sockfd, EPOLLIN);
        init();
        return true;
    }
    while(1)
    {
   
        temp = writev(m_sockfd, m_iv, m_iv_count);
        if(temp <= -1)
        {
   
            //如果TCP写缓冲没有空间,则等待下一轮RPOLLOUT事件。虽然在此期间,服务器无法立即接受到同一个客户的下一个请求,但这可以保证链接的完整性。
            if(errno == EAGAIN)
            {
   
                modfd(m_epollfd, m_sockfd, EPOLLOUT);
                return true;
            }
            unmap();
            return false;
        }
        bytes_to_send -= temp;
        bytes_have_send += temp;
        /*
         *
         *下面此处应该为bytes_to_send小于0才能判断传输结束
         *
         *
        */
        if(bytes_to_send <= bytes_have_send)
        {
   
            //发送HTTP相应成功,更具HTTP请求中的Connection字段决定是否立即关闭连接
            unmap();
            if(m_linger)
            {
   
                init();
                modfd(m_epollfd, m_sockfd, EPOLLIN);
                return true;
            }
            else
            
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值