实现游双《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