Simple socket conumdrum

W

Will Hartung

I have a brain dead Client and equally unsophisticated Server program.

The Client connects to the Server, server pops a thread, and then they have
a simple conversation.

The basic goal of the C/S system is simply to Move Data in order to evaluate
timings and what not for a project.

I don't care WHAT the data is, I just want to move some.

Here's the meat of the Server:

I get the InputStream using:

InputStream is = socket.getInputStream();

My blocksize is 8192.

Then, I run this little loop:
while(totalRcvd != totalCnt) {
int amtToRead = blocksize;
if (amtToRead > (totalCnt - totalRcvd)) {
amtToRead = totalCnt - totalRcvd;
}
int amtRcvd = is.read(buffer, 0, amtToRead);
totalRcvd = totalRcvd + amtRcvd;
}

For a small amount of data, 10240 bytes, this works fine.

When I bump up to 102400 bytes, it hangs about 70% of the way into the total
amount, meanwhile the client thinks that it has completed sending the data
and is awaiting acknowledgment from the server.

If I kill the client at this point, then the sockets are closed and I get an
appropriate exception on the server.

Finally, running the client and server on my windows machine, it works
(though it is not consistent). It consistently fails with the server on a
Solaris 8 machine.

Anyone have any hints why this is hanging up?

Thanx!

Regards,

Will Hartung
([email protected])
 
D

dar7yl

When I bump up to 102400 bytes, it hangs about 70% of the way into the
total
amount, meanwhile the client thinks that it has completed sending the data
and is awaiting acknowledgment from the server.

It sounds like the http socket is timing out.
Try turning off buffering for the output, and write a block at a time.
(btw, I didn't see anywhere you are actually writing the data to the
client)

as a matter of style, recode your loop as follows:
(the brace style is your own preference, I abhor K&R style)
<code>
int remainder = totalCnt;
while (remainder > 0)
{
int amtToRead = remainder ;
if (amtToRead > BLOCKSIZE)
{
amtToRead = BLOCKSIZE;
}
int amtRcvd = is.read(buffer, 0, amtToRead);
remainder -= amtRcvd;

// now, what are you doing with your buffer here?
} // while
</code>

regards,
Dar7yl
 
M

Matt Humphrey

Will Hartung said:
I have a brain dead Client and equally unsophisticated Server program.

The Client connects to the Server, server pops a thread, and then they have
a simple conversation.

The basic goal of the C/S system is simply to Move Data in order to evaluate
timings and what not for a project.

I don't care WHAT the data is, I just want to move some.

Here's the meat of the Server:

I get the InputStream using:

InputStream is = socket.getInputStream();

My blocksize is 8192.

Then, I run this little loop:
while(totalRcvd != totalCnt) {
int amtToRead = blocksize;
if (amtToRead > (totalCnt - totalRcvd)) {
amtToRead = totalCnt - totalRcvd;
}
int amtRcvd = is.read(buffer, 0, amtToRead);
totalRcvd = totalRcvd + amtRcvd;
}

Just for completeness sake, are you sure you set totalRcvd to 0 after each
message? Also, how is totalCnt count assigned? Are you sure it's the same
for both? (e.g. is it sent as a 2-byte prefix or a 4-byte prefix?) Is the
data being sent as bytes (not characters) down a corresponding Output
Stream?

Cheers,
Matt Humphrey (e-mail address removed) http://www.iviz.com/
 
S

Steve Horsley

Will said:
I have a brain dead Client and equally unsophisticated Server program.

The Client connects to the Server, server pops a thread, and then they have
a simple conversation.

The basic goal of the C/S system is simply to Move Data in order to evaluate
timings and what not for a project.

I don't care WHAT the data is, I just want to move some.

Here's the meat of the Server:

I get the InputStream using:

InputStream is = socket.getInputStream();

My blocksize is 8192.

Then, I run this little loop:
while(totalRcvd != totalCnt) {
int amtToRead = blocksize;
if (amtToRead > (totalCnt - totalRcvd)) {
amtToRead = totalCnt - totalRcvd;
}
int amtRcvd = is.read(buffer, 0, amtToRead);
totalRcvd = totalRcvd + amtRcvd;
}

For a small amount of data, 10240 bytes, this works fine.

When I bump up to 102400 bytes, it hangs about 70% of the way into the total
amount, meanwhile the client thinks that it has completed sending the data
and is awaiting acknowledgment from the server.

If I kill the client at this point, then the sockets are closed and I get an
appropriate exception on the server.

Finally, running the client and server on my windows machine, it works
(though it is not consistent). It consistently fails with the server on a
Solaris 8 machine.

Anyone have any hints why this is hanging up?

Nothing jumps out at me. Try printing totalRcvd and amtToRead just before
you call is.read(), and printing totalRcvd just after it returns, and
see if they make sense.

Also, changing while(totalRecvd != totalCnt) to
while(totalRecvd < totalCnt) would feel more robust to me.

Steve
 
E

Esmond Pitt

Will said:
while(totalRcvd != totalCnt) {
int amtToRead = blocksize;
if (amtToRead > (totalCnt - totalRcvd)) {
amtToRead = totalCnt - totalRcvd;
}
int amtRcvd = is.read(buffer, 0, amtToRead);
totalRcvd = totalRcvd + amtRcvd;
}

Consider what happens if you get a premature EOF. You aren't checking
for this condition, you're assuming that all the data will arrive. Very
optimistic ...
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top