public ClientUpdateReply DoClientUpdate(string[] serverAddresses, int serverPort, int clientNumber, int clientPin, int clientPort) { if (!ConnectToAnyServer(serverAddresses, serverPort)) { return(null); } ClientUpdateReply reply = SendClientUpdate(clientNumber, clientPin, clientPort); Disconnect(); return(reply); }
/// <summary> /// Update own ip-number /// </summary> /// <param name="number"></param> /// <returns>peer or null</returns> private ClientUpdateReply SendClientUpdate(int number, int pin, int port) { Logging.Instance.Log(LogTypes.Debug, TAG, nameof(SendClientUpdate), $"number='{number}'"); ClientUpdateReply reply = new ClientUpdateReply(); if (client == null) { Logging.Instance.Error(TAG, nameof(SendPeerQuery), "no server connection"); reply.Error = "no server connection"; return(reply); } byte[] sendData = new byte[2 + 8]; sendData[0] = 0x01; // packet type: client update sendData[1] = 0x08; // length byte[] data = BitConverter.GetBytes((UInt32)number); Buffer.BlockCopy(data, 0, sendData, 2, 4); data = BitConverter.GetBytes((UInt16)pin); Buffer.BlockCopy(data, 0, sendData, 6, 2); data = BitConverter.GetBytes((UInt16)port); Buffer.BlockCopy(data, 0, sendData, 8, 2); try { stream.Write(sendData, 0, sendData.Length); } catch (Exception ex) { Logging.Instance.Error(TAG, nameof(SendPeerQuery), $"error sending data to subscribe server", ex); reply.Error = "reply server error"; return(reply); } byte[] recvData = new byte[6]; int recvLen = 0; try { recvLen = stream.Read(recvData, 0, recvData.Length); } catch (Exception ex) { Logging.Instance.Error(TAG, nameof(SendPeerQuery), $"error receiving data from subscribe server", ex); reply.Error = "reply server error"; return(reply); } if (recvLen != 6) { Logging.Instance.Log(LogTypes.Info, TAG, nameof(SendPeerSearch), $"wrong reply packet size ({recvLen})"); reply.Error = "error"; return(reply); } if (recvData[0] != 0x02) { // peer not found Logging.Instance.Log(LogTypes.Info, TAG, nameof(SendPeerSearch), $"wrong reply packet, type={recvData[0]:X2}"); reply.Error = "error"; return(reply); } reply.Success = true; reply.IpAddress = $"{recvData[2]}.{recvData[3]}.{recvData[4]}.{recvData[5]}"; reply.Error = "ok"; return(reply); }