//! Отправить команду public PipeMessage Command(string sCommand) { if (sCommand.Length == 0) { return(new PipeMessage()); } // Формируем команду PipeMessage Message = new PipeMessage(); Message.nID = DateTime.Now.Millisecond * DateTime.Now.Millisecond; Message.nResponceID = 0; Message.nFrom = Process.GetCurrentProcess().Id; Message.nTo = m_nServerID; Message.nType = (int)PipeMessage.__eMessageType.eSystem; if ("Set" == sCommand) { Message.nType = (int)PipeMessage.__eMessageType.eSettings; Message.Settings = m_Settings.Get(); } Help.StrCopy(ref Message.Message, sCommand); // Ждем пайп while (!IsServerCreated()) { Thread.Sleep(100); } // Коннектимся к пайпу if (!Connect()) { return(new PipeMessage()); } // Отсылаем Send(Message); byte[] TempBuffer = new byte[m_nBufSize]; // Ждем ответ int nBytesRead = m_Stream.Read(TempBuffer, 0, m_nBufSize); // Принимаем if (nBytesRead > 0) { // Конвертируем обратно в структуру Message = ByteArrayToMessage(TempBuffer); } m_Stream.Close(); m_Stream.Dispose(); return(Message); }
public PipeMessage Send(string sCommand) { if (sCommand.Length == 0) { return(new PipeMessage()); } // Формируем команду PipeMessage Message = new PipeMessage(); Message.nID = DateTime.Now.Millisecond * DateTime.Now.Millisecond; Message.nResponceID = 0; Message.nFrom = Process.GetCurrentProcess().Id; Message.nTo = m_nServerID; Message.nType = (int)PipeMessage.__eMessageType.eSystem; if ("Set" == sCommand) { Message.nType = (int)PipeMessage.__eMessageType.eSettings; Message.Settings = m_Settings.Get(); } Help.StrCopy(ref Message.Message, sCommand); m_Buffer = MessageToByteArray(Message); //FormatBuffer(m_Buffer, sCommand); int rc = 0; try { // Try to resolve the remote host name or address m_ResolvedHost = Dns.GetHostEntry(m_sRemoteName); Console.WriteLine("Client: GetHostEntry() is OK..."); // Try each address returned foreach (IPAddress addr in m_ResolvedHost.AddressList) { // Create a socket corresponding to the address family of the resolved address m_ClientSocket = new Socket( addr.AddressFamily, m_SockType, m_SockProtocol ); Console.WriteLine("Client: Socket() is OK..."); try { // Create the endpoint that describes the destination m_Destination = new IPEndPoint(addr, m_nRemotePort); Console.WriteLine("Client: IPEndPoint() is OK. IP Address: {0}, server port: {1}", addr, m_nRemotePort); if ((m_SockProtocol == ProtocolType.Udp) && (m_bUdpConnect == false)) { Console.WriteLine("Client: Destination address is: {0}", m_Destination.ToString()); break; } else { Console.WriteLine("Client: Attempting connection to: {0}", m_Destination.ToString()); } m_ClientSocket.Connect(m_Destination); Console.WriteLine("Client: Connect() is OK..."); break; } catch (SocketException) { // Connect failed, so close the socket and try the next address m_ClientSocket.Close(); Console.WriteLine("Client: Close() is OK..."); m_ClientSocket = null; continue; } } // Make sure we have a valid socket before trying to use it if ((m_ClientSocket != null) && (m_Destination != null)) { try { // Send the request to the server if ((m_SockProtocol == ProtocolType.Udp) && (m_bUdpConnect == false)) { m_ClientSocket.SendTo(m_Buffer, m_Destination); Console.WriteLine("Client: SendTo() is OK...UDP..."); } else { rc = m_ClientSocket.Send(m_Buffer); Console.WriteLine("Client: send() is OK...TCP..."); Console.WriteLine("Client: Sent request of {0} bytes", rc); // For TCP, shutdown sending on our side since the client won't send any more data if (m_SockProtocol == ProtocolType.Tcp) { m_ClientSocket.Shutdown(SocketShutdown.Send); Console.WriteLine("Client: Shutdown() is OK..."); } } // Receive data in a loop until the server closes the connection. For // TCP this occurs when the server performs a shutdown or closes // the socket. For UDP, we'll know to exit when the remote host // sends a zero byte datagram. while (true) { if ((m_SockProtocol == ProtocolType.Tcp) || (m_bUdpConnect == true)) { m_ClientSocket.ReceiveTimeout = 1000; rc = m_ClientSocket.Receive(m_Buffer); Console.WriteLine("Client: Receive() is OK..."); Console.WriteLine("Client: Read {0} bytes", rc); } else { IPEndPoint fromEndPoint = new IPEndPoint(m_Destination.Address, 0); Console.WriteLine("Client: IPEndPoint() is OK..."); EndPoint castFromEndPoint = (EndPoint)fromEndPoint; rc = m_ClientSocket.ReceiveFrom(m_Buffer, ref castFromEndPoint); Console.WriteLine("Client: ReceiveFrom() is OK..."); fromEndPoint = (IPEndPoint)castFromEndPoint; Console.WriteLine("Client: Read {0} bytes from {1}", rc, fromEndPoint.ToString()); } // Exit loop if server indicates shutdown if (rc == 0) { m_ClientSocket.Close(); Console.WriteLine("Client: Close() is OK..."); break; } else { Message = ByteArrayToMessage(m_Buffer); return(Message); } } } catch (SocketException err) { Console.WriteLine("Client: Error occurred while sending or receiving data."); Console.WriteLine(" Error: {0}", err.Message); } } else { Console.WriteLine("Client: Unable to establish connection to server!"); } } catch (SocketException err) { Console.WriteLine("Client: Socket error occurred: {0}", err.Message); } return(new PipeMessage()); }