read/select not blocking on SSL socket?

Y

yermej

I'm working on an SSL client/server application using persistent TLSv1
connections. I'm having some issues with my server and what I think
should be a blocking read or select.

I'm basically doing this where @io is an OpenSSL::SSL::SSLSocket:

until @data.length == READ_SIZE do
tmp = @io.read(READ_SIZE - @data.length)
if tmp.nil?
IO.select [@io]
else
@data << tmp
end
end

(I did not initially have the select call, but decided to give that a
try.)

I would expect that the read would block (I have not set O_NONBLOCK on
the socket) until there is data to be read. Instead, when there is no
data, every read call returns nil. I thought the select would fix
that, but it returns immediately and the read call again returns nil.

Am I misunderstanding how this should work? Would the fact that it's
an SSL connection cause the issue?

I'm using 1.8.4 on Linux.

Thanks for any insights you can offer.

Jeremy
 
Y

yermej

I'm working on an SSL client/server application using persistent TLSv1
connections. I'm having some issues with my server and what I think
should be a blocking read or select.

I'm basically doing this where @io is an OpenSSL::SSL::SSLSocket:

until @data.length == READ_SIZE do
tmp = @io.read(READ_SIZE - @data.length)
if tmp.nil?
IO.select [@io]
else
@data << tmp
end
end

(I did not initially have the select call, but decided to give that a
try.)

I would expect that the read would block (I have not set O_NONBLOCK on
the socket) until there is data to be read. Instead, when there is no
data, every read call returns nil. I thought the select would fix
that, but it returns immediately and the read call again returns nil.

Am I misunderstanding how this should work? Would the fact that it's
an SSL connection cause the issue?

I'm using 1.8.4 on Linux.

Thanks for any insights you can offer.

Jeremy

I have an update to my initial question. I replaced my read calls with
sysread. With one client who sends to this server, the read or sysread
blocks as expected. With the other, the read always returns nil and
sysread always throws EOFError exceptions when I think it should
block. I catch EOFError and sysread again, but instead of blocking, it
throws EOFError again. And again. Etc.

Is this the correct behavior if they are keeping the client end of the
connection open (the working client -- the one where the read blocks
-- seems be keeping the connection open) or should the read be
blocking?

At this point, I'm beginning to think my only option will be to sleep
and then check the connection for data in a loop.

Jeremy
 
G

grocery_stocker

I'm working on an SSL client/server application using persistent TLSv1
connections. I'm having some issues with my server and what I think
should be a blocking read or select.

I also understood Ruby io.read to be blocking.
I'm basically doing this where @io is an OpenSSL::SSL::SSLSocket:

until @data.length == READ_SIZE do
tmp = @io.read(READ_SIZE - @data.length)
if tmp.nil?
IO.select [@io]
else
@data << tmp
end
end

(I did not initially have the select call, but decided to give that a
try.)

I would expect that the read would block (I have not set O_NONBLOCK on
the socket) until there is data to be read. Instead, when there is no
data, every read call returns nil. I thought the select would fix
that, but it returns immediately and the read call again returns nil.

Am I misunderstanding how this should work? Would the fact that it's
an SSL connection cause the issue?

I'm using 1.8.4 on Linux.

Thanks for any insights you can offer.

Jeremy


Maybe I'm not the best person to be giving advice, but I don't think
your do/end is a legal Ruby construction.

I was under the impression you would use do/end like the following

sock.each_line do |line|
puts line
end

Notice the nifty | | thingies. This will read each line and then
return.


Chad
 
G

grocery_stocker

I'm working on an SSL client/server application using persistent TLSv1
connections. I'm having some issues with my server and what I think
should be a blocking read or select.

I also understood Ruby io.read to be blocking.


I'm basically doing this where @io is an OpenSSL::SSL::SSLSocket:
until @data.length == READ_SIZE do
tmp = @io.read(READ_SIZE - @data.length)
if tmp.nil?
IO.select [@io]
else
@data << tmp
end
end
(I did not initially have the select call, but decided to give that a
try.)
I would expect that the read would block (I have not set O_NONBLOCK on
the socket) until there is data to be read. Instead, when there is no
data, every read call returns nil. I thought the select would fix
that, but it returns immediately and the read call again returns nil.
Am I misunderstanding how this should work? Would the fact that it's
an SSL connection cause the issue?
I'm using 1.8.4 on Linux.
Thanks for any insights you can offer.

Maybe I'm not the best person to be giving advice, but I don't think
your do/end is a legal Ruby construction.

I was under the impression you would use do/end like the following

sock.each_line do |line|
puts line
end

Notice the nifty | | thingies. This will read each line and then
return.

Chad


Disregard the post. Your do/end is legal. I think I was thinking of
something else when I made the comment.
 

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

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top