internal bool SendRaw(byte[] message, int start, int length, IPEndPoint remoteEndPoint) { if (!IsRunning) { return(false); } SocketError errorCode = 0; if (_socket.SendTo(message, start, length, remoteEndPoint, ref errorCode) <= 0) { return(false); } NetPeer fromPeer; switch (errorCode) { case SocketError.MessageSize: NetUtils.DebugWrite(ConsoleColor.Red, "[SRD] 10040, datalen: {0}", length); return(false); case SocketError.HostUnreachable: if (_peers.TryGetValue(remoteEndPoint, out fromPeer)) { DisconnectPeer(fromPeer, DisconnectReason.SocketSendError, errorCode, true, null, 0, 0); } CreateEvent(NetEvent.EType.Error, remoteEndPoint: remoteEndPoint, errorCode: errorCode); return(false); case SocketError.ConnectionReset: //connection reset (connection closed) if (_peers.TryGetValue(remoteEndPoint, out fromPeer)) { DisconnectPeer(fromPeer, DisconnectReason.RemoteConnectionClose, errorCode, true, null, 0, 0); } return(false); } #if STATS_ENABLED Statistics.PacketsSent++; Statistics.BytesSent += (uint)length; #endif return(true); }
internal bool SendRaw(byte[] message, int start, int length, NetEndPoint remoteEndPoint) { if (!IsRunning) { return(false); } int errorCode = 0; if (_socket.SendTo(message, start, length, remoteEndPoint, ref errorCode) <= 0) { return(false); } //10040 message to long... need to check //10065 no route to host if (errorCode == 10040) { NetUtils.DebugWrite(ConsoleColor.Red, "[SRD] 10040, datalen: {0}", length); return(false); } if (errorCode != 0 && errorCode != 10065) { //Send error NetPeer fromPeer; if (_peers.TryGetValue(remoteEndPoint, out fromPeer)) { DisconnectPeer(fromPeer, DisconnectReason.SocketSendError, errorCode, true, null, 0, 0); } var netEvent = CreateEvent(NetEventType.Error); netEvent.RemoteEndPoint = remoteEndPoint; netEvent.AdditionalData = errorCode; EnqueueEvent(netEvent); return(false); } #if STATS_ENABLED Statistics.PacketsSent++; Statistics.BytesSent += (uint)length; #endif return(true); }