C#局域网开启其他主机上的进程

〇、注
1.一、二主题内容摘自于MSDN。
2.以下示例代码经简单修改可轻易实现局域网开启其他主机进程的功能。
3.ipHostInfo.AddressList[0]中返回的并不一定是主机的IPv4地址,在IPv4地址上开启的端口并不能通过IPv6访问。套接字是IP地址与端口号的组合。
一、Socket示例代码
以下示例程序创建连接到服务器的客户端。 客户端使用同步套接字构建,因此,将暂停执行客户端应用程序,直到服务器返回响应。 应用程序向服务器发送一个字符串,然后控制台上显示服务器返回的字符串。
1.同步客户端套接字示例

using System;  
using System.Net;  
using System.Net.Sockets;  
using System.Text;  
  
public class SynchronousSocketClient {  
  
    public static void StartClient() {  
        // Data buffer for incoming data.  
        byte[] bytes = new byte[1024];  
  
        // Connect to a remote device.  
        try {  
            // Establish the remote endpoint for the socket.  
            // This example uses port 11000 on the local computer.  
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());  
            IPAddress ipAddress = ipHostInfo.AddressList[0];  
            IPEndPoint remoteEP = new IPEndPoint(ipAddress,11000);  
  
            // Create a TCP/IP  socket.  
            Socket sender = new Socket(ipAddress.AddressFamily,
                SocketType.Stream, ProtocolType.Tcp );  
  
            // Connect the socket to the remote endpoint. Catch any errors.  
            try {  
                sender.Connect(remoteEP);  
  
                Console.WriteLine("Socket connected to {0}",  
                    sender.RemoteEndPoint.ToString());  
  
                // Encode the data string into a byte array.  
                byte[] msg = Encoding.ASCII.GetBytes("This is a test");  
  
                // Send the data through the socket.  
                int bytesSent = sender.Send(msg);  
  
                // Receive the response from the remote device.  
                int bytesRec = sender.Receive(bytes);  
                Console.WriteLine("Echoed test = {0}",  
                    Encoding.ASCII.GetString(bytes,0,bytesRec));  
  
                // Release the socket.  
                sender.Shutdown(SocketShutdown.Both);  
                sender.Close();  
  
            } catch (ArgumentNullException ane) {  
                Console.WriteLine("ArgumentNullException : {0}",ane.ToString());  
            } catch (SocketException se) {  
                Console.WriteLine("SocketException : {0}",se.ToString());  
            } catch (Exception e) {  
                Console.WriteLine("Unexpected exception : {0}", e.ToString());  
            }  
  
        } catch (Exception e) {  
            Console.WriteLine( e.ToString());  
        }  
    }  
  
    public static int Main(String[] args) {  
        StartClient();  
        return 0;  
    }  
}

2.同步服务器套接字示例
以下示例程序创建从客户端接收连接请求的服务器。 服务器使用同步套接字构建,因此在等待客户端的连接时,暂停执行服务器应用程序。 应用程序从客户端接收字符串,在控制台上显示此字符串,然后将此字符串回显给客户端。 来自客户端的字符串必须包含字符串“”以在消息结束时发出信号。

using System;  
using System.Net;  
using System.Net.Sockets;  
using System.Text;  
  
public class SynchronousSocketListener {  
  
    // Incoming data from the client.  
    public static string data = null;  
  
    public static void StartListening() {  
        // Data buffer for incoming data.  
        byte[] bytes = new Byte[1024];  
  
        // Establish the local endpoint for the socket.  
        // Dns.GetHostName returns the name of the
        // host running the application.  
        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());  
        IPAddress ipAddress = ipHostInfo.AddressList[0];  
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);  
  
        // Create a TCP/IP socket.  
        Socket listener = new Socket(ipAddress.AddressFamily,  
            SocketType.Stream, ProtocolType.Tcp );  
  
        // Bind the socket to the local endpoint and
        // listen for incoming connections.  
        try {  
            listener.Bind(localEndPoint);  
            listener.Listen(10);  
  
            // Start listening for connections.  
            while (true) {  
                Console.WriteLine("Waiting for a connection...");  
                // Program is suspended while waiting for an incoming connection.  
                Socket handler = listener.Accept();  
                data = null;  
  
                // An incoming connection needs to be processed.  
                while (true) {  
                    int bytesRec = handler.Receive(bytes);  
                    data += Encoding.ASCII.GetString(bytes,0,bytesRec);  
                    if (data.IndexOf("") > -1) {  
                        break;  
                    }  
                }  
  
                // Show the data on the console.  
                Console.WriteLine( "Text received : {0}", data);  
  
                // Echo the data back to the client.  
                byte[] msg = Encoding.ASCII.GetBytes(data);  
  
                handler.Send(msg);  
                handler.Shutdown(SocketShutdown.Both);  
                handler.Close();  
            }  
  
        } catch (Exception e) {  
            Console.WriteLine(e.ToString());  
        }  
  
        Console.WriteLine("\nPress ENTER to continue...");  
        Console.Read();  
  
    }  
  
    public static int Main(String[] args) {  
        StartListening();  
        return 0;  
    }  
}

3.IPHostEntry 类
为 Internet 主机地址信息提供容器类。

示例
下面的示例在 DNS 数据库中查询主机信息 www.contoso.com ,并返回实例中的信息 IPHostEntry 。

IPHostEntry hostInfo = Dns.GetHostEntry("www.contoso.com");

注解
IPHostEntry类将域名系统 (DNS) 主机名与一组别名和匹配的 IP 地址的数组关联。

IPHostEntry类用作类的帮助器类 Dns 。

属性
AddressList
获取或设置与主机关联的 IP 地址列表。

Aliases
获取或设置与主机关联的别名列表。

HostName
获取或设置主机的 DNS 名称。

StudySample:

IPHostEntry hostInfo = Dns.GetHostEntry(Dns.GetHostName());

Console.WriteLine("HostName:");
Console.WriteLine(hostInfo.HostName);

Console.WriteLine("AddressList:");
for (int i = 0; i < hostInfo.AddressList.Length; i++)
	Console.WriteLine(hostInfo.AddressList[i]);

Console.WriteLine("Aliases:");
for (int i = 0; i < hostInfo.Aliases.Length; i++)
	Console.WriteLine(hostInfo.Aliases[i]);

Output:

HostName:
M4E4TBOM1KZBOV1
AddressList:
192.168.0.18
192.168.45.1
192.168.170.1
192.168.18.125
::1
Aliases:
IPHostEntry hostInfo = Dns.GetHostEntry("www.contoso.com");

Output:

HostName:
contoso.com
AddressList:
40.112.72.205
40.113.200.201
13.77.161.179
40.76.4.15
104.215.148.63
Aliases:

4.Dns.GetHostName 方法
获取本地计算机的主机名。

// Get the local computer host name.
String hostName = Dns.GetHostName();
Console.WriteLine("Computer name :" + hostName);

5.IPAddress.Parse 方法
静态方法根据 IPv4 的以点分隔的四部分表示 Parse IPAddress 法和 IPv6 的冒号十六进制表示法创建一个实例。

// Create an instance of IPAddress for the specified address string (in
// dotted-quad, or colon-hexadecimal notation).
IPAddress address = IPAddress.Parse("192.168.0.15");

5.IPEndPoint类
Represents a network endpoint as an IP address and a port number.

重载

IPEndPoint(Int64, Int32) 	

用指定的地址和端口号初始化 IPEndPoint 类的新实例。

IPEndPoint(IPAddress, Int32) 	

用指定的地址和端口号初始化 IPEndPoint 类的新实例。

IPEndPoint(Int64, Int32)

用指定的地址和端口号初始化 IPEndPoint 类的新实例。
C#

public IPEndPoint (long address, int port);

参数

address Int64

Internet 主机的 IP 地址。 例如,大端格式的值 0x2414188f 可能为 IP 地址“143.24.20.36”。

port Int32

与 address 关联的端口号,或为 0 以指定任何可用端口。 port 以主机顺序排列。

// Obtain the IP address from the list of IP addresses associated with the server.
foreach(IPAddress address in host.AddressList)
{
  IPEndPoint endpoint = new IPEndPoint(address, port);

  tempSocket =
    new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

  tempSocket.Connect(endpoint);

  if(tempSocket.Connected)
  {
    // Display the endpoint information.
    displayEndpointInfo(endpoint);
    // Serialize the endpoint to obtain a SocketAddress object.
    serializedSocketAddress = serializeEndpoint(endpoint);
    break;
  }
  else
            {
                continue;
            }
        }

二、开启进程
1.Process.Start 方法
启动进程资源并将其与 Process 组件关联。

通过指定应用程序的名称和一组命令行参数来启动一个进程资源,并将该资源与新的 Process 组件相关联。

public static System.Diagnostics.Process Start (string fileName, string arguments);

参数

fileName String

要在进程中运行的应用程序文件的名称。

arguments String

启动该进程时传递的命令行参数。
返回

Process

与进程资源关联的新 Process,如果未启动进程资源,则为 null。 请注意,伴随同一进程中已运行的实例而启动的新进程将独立于其他进程。 此外,启动可能返回一个 HasExited 属性已设置为 true 的非 null 进程。 在这种情况下,启动的进程可能已激活现有实例自身,然后退出。

示例

下面的示例首先生成 Internet Explorer 的一个实例,并在浏览器中显示 “收藏夹” 文件夹的内容。 然后,它将启动其他一些 Internet Explorer 实例,并显示某些特定页面或站点。 最后,当导航到特定站点时,它会在窗口最小化时启动 Internet Explorer。

using System;
using System.Diagnostics;
using System.ComponentModel;

namespace MyProcessSample
{
    class MyProcess
    {
        // Opens the Internet Explorer application.
        void OpenApplication(string myFavoritesPath)
        {
            // Start Internet Explorer. Defaults to the home page.
            Process.Start("IExplore.exe");

            // Display the contents of the favorites folder in the browser.
            Process.Start(myFavoritesPath);
        }

        // Opens urls and .html documents using Internet Explorer.
        void OpenWithArguments()
        {
            // url's are not considered documents. They can only be opened
            // by passing them as arguments.
            Process.Start("IExplore.exe", "www.northwindtraders.com");

            // Start a Web page using a browser associated with .html and .asp files.
            Process.Start("IExplore.exe", "C:\\myPath\\myFile.htm");
            Process.Start("IExplore.exe", "C:\\myPath\\myFile.asp");
        }

        // Uses the ProcessStartInfo class to start new processes,
        // both in a minimized mode.
        void OpenWithStartInfo()
        {
            ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
            startInfo.WindowStyle = ProcessWindowStyle.Minimized;

            Process.Start(startInfo);

            startInfo.Arguments = "www.northwindtraders.com";

            Process.Start(startInfo);
        }

        static void Main()
        {
            // Get the path that stores favorite links.
            string myFavoritesPath =
                Environment.GetFolderPath(Environment.SpecialFolder.Favorites);

            MyProcess myProcess = new MyProcess();

            myProcess.OpenApplication(myFavoritesPath);
            myProcess.OpenWithArguments();
            myProcess.OpenWithStartInfo();
        }
    }
}

三、网络连接测试命令
1.ping

ping 192.168.91.13

2.telnet

telnet 192.168.91.13  11000

3.netstat

netstat -an

四、通过System.Diagnostics.Process开启Unity进程时传递参数
1.Environment类

using System;

class Sample
{
    public static void Main()
    {
        Console.WriteLine();
        //  Invoke this sample with an arbitrary set of command line arguments.
        string[] arguments = Environment.GetCommandLineArgs();
        Console.WriteLine("GetCommandLineArgs: {0}", string.Join(", ", arguments));
    }
}

2.Environment.GetCommandLineArgs Method
Returns a string array containing the command-line arguments for the current process.

string[] arguments = Environment.GetCommandLineArgs();

你可能感兴趣的:(Unity,3D与编程语言,Unix,计算机网络和网络编程,c#,网络互联)