 		isConnected: ( ) ->
 			return @_connection.iceConnectionState is 'connected'
 
+		# Returns wether or not the data channel to this peer is open
+		#
+		# @return [Boolean] wether or not the channel is open
+		#
+		isChannelOpen: ( ) ->
+			return @_channel?.readyState is 'open'
+
 		# Sends a predefined message to the remote.
 		#
 		# @param message [Message] the message to send
 		#
-		_send: ( message ) ->
-			unless @_channel?.readyState is 'open'
+		_send: ( message, retries = 0 ) ->
+			maxRetries = 5
+
+			unless @isChannelOpen()
 				return
 			
-			@_channel.send(message.serialize())
+			try
+				@_channel.send(message.serialize())
+			catch error
+				if retries < maxRetries
+					_( => @_send(message, retries + 1)).defer()
+				else
+					console.log 'failed to send message', message
 
 		# Adds a new data channel, and adds event bindings to it.
 		#

		# @param event [Event] the channel close event
		#
		_onChannelClose: ( event ) =>
			@_channelOpen is false
			@trigger('channel.closed', @, event)

		# Is called when a connection has been established.

		# @param event [Event] the channel open event
		#
		_onChannelOpen: ( event ) =>
			@_pingInterval = setInterval( ( ) =>
				@ping( ( latency, coordinateString ) => 
					@latency = latency
