# Read/select not blocking on SSL socket?

**URL:** <https://www.ruby-forum.com/t/read-select-not-blocking-on-ssl-socket/113416>\
**Category:** Ruby\
**Created:** [August 30, 2007, 10:25pm UTC](https://www.ruby-forum.com/t/read-select-not-blocking-on-ssl-socket/113416 "2007-08-30T22:25:51Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [August 30, 2007, 10:25pm UTC](https://www.ruby-forum.com/t/read-select-not-blocking-on-ssl-socket/113416/1 "2007-08-30T22:25:51Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [August 30, 2007, 11:32pm UTC](https://www.ruby-forum.com/t/read-select-not-blocking-on-ssl-socket/113416/2 "2007-08-30T23:32:58Z")

</div>

On Aug 30, 3:20 pm, “removed\_email\_address@domain.invalid” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> else  
> 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

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [August 31, 2007, 4:31am UTC](https://www.ruby-forum.com/t/read-select-not-blocking-on-ssl-socket/113416/3 "2007-08-31T04:31:22Z")

</div>

On Aug 30, 1:20 pm, “removed\_email\_address@domain.invalid” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 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 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

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [August 31, 2007, 4:33am UTC](https://www.ruby-forum.com/t/read-select-not-blocking-on-ssl-socket/113416/4 "2007-08-31T04:33:22Z")

</div>

On Aug 30, 5:58 pm, grocery\_stocker [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > I’m basically doing this where @io is an OpenSSL::SSL::SSLSocket:  
> > (I did not initially have the select call, but decided to give that a  
> > I’m using 1.8.4 on Linux.  
> > 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.
