[cs631apue] Writing to socket while client is still writing to it

lbustama lbustama at stevens.edu
Tue Dec 3 00:54:17 EST 2013


Hi,  I'm running into the following issue.

When we receive HTTP request, where the first line is greater 4096 
bytes, we stop reading from the socket, and reply with a 400 error code 
and send a generic HTML page with the 400 error code. When we test with 
a large request from the localhost the output received by the client 
looks as expected. When we test from a remote host we only receive the 
first line of output. I stepped through the code using gdb and the 
server is going through the same exact code and sending the full 
response. In fact when executing the code step by step using gdb the 
remote client receives the full output (not just the 1st line). I think 
the issue is happening because the client is still writing to the socket 
when the response is sent by the server (MTU sizes are different if 
working from the localhost vs a remote host):


FROM THE LOCALHOST:
$echo "GET $(echo -n /; for i in {1..10000}; do  echo -n $i; if [ $(($i 
% 50)) -eq 0 ]; then echo -n /; fi; done | tr [:digit:] a-z) HTTP/1.0" | 
nc localhost 9090
HTTP/1.0 400 Bad Request
Date: Tue, 03 Dec 2013 05:35:30 GMT
Server: sws/1.0
Content-Length: 0

<html>
<head>
<title>Team Geronimo - 400 - Bad Request</title>
</head>
<body>
<h1>Team Geronimo</h1>
<p>400 - Bad Request</p>
</body>
</html>

FROM A REMOTE HOST:
$echo "GET $(echo -n /; for i in {1..10000}; do  echo -n $i; if [ $(($i 
% 50)) -eq 0 ]; then echo -n /; fi; done | tr [:digit:] a-z) HTTP/1.0" | 
nc eva 9090
HTTP/1.0 400 Bad Request   <<<<<<<<<<<<<<<<<<<<<<<<ONLY THE FIRST LINE

If I change the code to finish reading all the input from the socket 
before sending the response "while(read(socket,buf, sizeof(buf))", the 
remote connection displays the right output, but that just leaves the 
server open for denial of service attacks (just keep on sending 
"infinite" junk to the server)


Is there something we're missing, or is this the way it's supposed to 
work.

Thanks a lot,

Luis


More information about the cs631apue mailing list