我正在编写一个在将页面发送到浏览器时遇到问题的网络服务器。它正确发送了第一个文件(该文件包括两个 css 文件)。但是,在它发送第二个文件后,浏览器停止请求数据。它总是错过完成页面所需的 css 文件之一。
这是一些交易:
GET / HTTP/1.1
Host: website.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
HTTP/1.1 OK 200
Server: thserver
Date: Mon Apr 15 17:29:51 2013
Content-Length: 564
Data received: GET /main.css HTTP/1.1
Host: website.com
Connection: keep-alive
Accept: text/css,*/*;q=0.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31
Referer: http://website.com/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
HTTP/1.1 OK 200
Server: thserver
Date: Mon Apr 15 17:29:51 2013
Content-Length: 386
如果有人也知道验证http事务的好方法,那也会有所帮助。我确实查看了 chrome 的开发工具并显示它正在等待接收最后一个文件,但我似乎从未在服务器上收到接收请求。
另外,我使用 telnet 来模拟浏览器,它运行良好。这是我输入的内容:
GET /
GET /index.css
GET /main.css
它每次都发回文件。
代码继续使用 read(2) 轮询套接字,但在第三个文件的请求应该到达时继续返回 EAGAIN 或 EWOULDBLOCK。
这是套接字 io 的代码:
const int port_number = 80;
const int timeout = 5000000;
const int wait_time = 10000;
PORT_CALL {
/* declarations here */
read_client:
result = read( socket[ 0 ], &header_buffer[ bytes_read ], BUFFER_SIZE - bytes_read );
if( result < 0 ){
if( errno & ( EWOULDBLOCK | EAGAIN ) ){
if( bytes_read > 0 ){
bytes_read = 0;
read_timeout = 0;
goto respond_request;
}
if( read_timeout < timeout ){
read_timeout += wait_time;
usleep( wait_time );
goto read_client;
}
}
goto exit_thread;
} else if( result > -1 ){
bytes_read += result;
goto read_client;
}
respond_request:
/* respond stuff start */
/* respond stuff end */
goto read_client;
exit_thread:
这是涉及创建套接字的代码
temp->socket_descriptor = socket( AF_INET, SOCK_STREAM, 0 );
temp->server_address.sin_family = AF_INET;
temp->server_address.sin_addr.s_addr = INADDR_ANY;
temp->server_address.sin_port = htons( * temp->port_number );
if( bind( temp->socket_descriptor,
( struct sockaddr * ) &temp->server_address,
sizeof( temp->server_address ) ) < 0 ) ..
listen( temp->socket_descriptor, 10 );
wait_for_client:
new_socket = accept( temp->socket_descriptor,
( struct sockaddr * ) &client_address,
&address_length );
我知道我可能要求太多了。任何人都知道一个很好的调试工具可以让我解决这个问题,我也将不胜感激。如果有人建议使用帮助我解决问题的调试器工具,我也会认为这是一个答案。
编辑:写入和读取功能现在处于循环中,但问题仍然存在。