Socket recv or gets?


#1

Hello there,

I wonder whats the difference between these methods ( gets and recv )

loop {
data = current_client.recv(100)
puts data
}

When I use “gets” instead of recv my socket connection stops and never
print out the message?

Why? :smiley:

Thanks…


#2

On 17.10.2008 09:40, Jamal S. wrote:

print out the message?

Why? :smiley:

See documentation. #gets tries to read a line (i.e. until it sees a line
terminator). Also, I believe recv also works with UDP while I am not
sure about gets.

Cheers

robert


#3

Robert K. wrote:

On 17.10.2008 09:40, Jamal S. wrote:

print out the message?

Why? :smiley:

See documentation. #gets tries to read a line (i.e. until it sees a line
terminator). Also, I believe recv also works with UDP while I am not
sure about gets.

Cheers

robert

Hmm, I looked before at documentation and they wrote…

“A separator of nil reads the entire contents…”

so I did :slight_smile:

@data = gets()

But my code stops after that and wouldn’t continue? even though
gets(nil) is the same, I also tried that, didn’t work.


#4

Jamal S. wrote:

so I did :slight_smile:

@data = gets()

in analogy to your recv-Example it should look like:
loop {
   data = current_client.gets
   puts data
}

:wink:
Andi


#5

unknown wrote:

Jamal S. wrote:

so I did :slight_smile:

@data = gets()

in analogy to your recv-Example it should look like:
loop {
   data = current_client.gets
   puts data
}

:wink:
Andi

This doesn’t work :slight_smile:

I also tried

while(data = gets)
p data
end

The code doesn’t continue :frowning:


#6

On 17.10.2008 12:09, Jamal S. wrote:

robert

Hmm, I looked before at documentation and they wrote…

“A separator of nil reads the entire contents…”

so I did :slight_smile:

@data = gets()

Look again. http://www.ruby-doc.org/core/classes/IO.html#M002297

Note, that instead of gets(nil) you can as well use read.

But my code stops after that and wouldn’t continue? even though
gets(nil) is the same, I also tried that, didn’t work.

You need to understand blocking IO: the IO operation blocks until
everything is read. In case of a socket, it will only return if there
was an error or the other party closed the socket. So, you need to
define the protocol in a way that you either know beforehand how much
you need to read (then you can use read(length) or recv(length)) or you
need a separator that you can use to recognize message end (then you can
use gets(separator)).

Kind regards

robert