UDP Asynchrone connection problems

G

Guest

Hi all !
I have made a little server-client system based on UDP protocole. the
goal
is to communicate in an asynchronous way, if some packets are lost it's
not a problem it's why i use UDP.
The packet must be routable so I use the same port to send and receive
packet into the server and the client (same socket).


It works but I have a problem, when a client diconnected from the server
and the server try to send a packet to the client, a ICMP message error
is
receive by the server :
"WSAECONNRESET : The virtual circuit was reset by the remote side
executing a hard or abortive close. For UPD sockets, the remote host was
unable to deliver a previously sent UDP datagram and responded with a
"Port Unreachable" ICMP packet. The application should close the socket
as
it is no longer usable."

Then the server raise an error :
server.rb:12:in `recvfrom': An existing connection was forcibly closed by
the remote host. - recvfrom(2) (Errno::ECONNRESET)

This error breaks my socket and I can't anymore receive or send packet,
so
how can I ignore this error ?


Here is a very simple code for testing (it works), usually I have a
timeout system when a client don't send any packets from a certain time
but I don't include it. The client send data with a frequency of 2 Herz
and the server with a frequency of 1Herz, usually the frequency is higher
like 60Hz (for doom-like game or others).

Try to run the server and a client then diconnect the client and wathc
what there appears on the server.

server.rb :
__________________________________________
#!/usr/bin/ruby
#server

require 'socket'

s = UDPSocket::new
s.bind('', 54321)

connected_client = Array::new

while true
packet = s.recvfrom(255)

if packet[0] == 'init'
new_num_client = rand(1000)
s.send(new_num_client.to_s, 0, packet[1][3], packet[1][1])
connected_client.push(new_num_client)

Thread::new(s, packet[0], packet[1][3], packet[1][1]){|s, data, ip,
port|
puts "A new client connected"
while true
sleep(1.0)
s.send("server data", 0, ip, port)
end
}
else
data = packet[0].split('|')
puts "according to data #{data[1]} from client #{data[1]} change
some state of the server"
end
end
__________________________________________


client.rb :
__________________________________________
#!/usr/bin/ruby
#client

require 'socket'

s = UDPSocket::new
s.connect('localhost', 54321)
s.send('init', 0)
packet = s.recvfrom(255)
my_num = packet[0].to_i

Thread::new{
while true
s.send("#{my_num}|client data : #{$*[0]}", 0)
sleep(0.5)
end
}

while true
packet = s.recvfrom(255)
puts "I received server data : #{packet[0]}"
end
__________________________________________



Thanks by advance (I dont if it can be say).

Greg Burri
 

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,770
Messages
2,569,584
Members
45,076
Latest member
OrderKetoBeez

Latest Threads

Top