Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#同时有多个TCP客户端_C#_Sockets_Tcpclient_Tcplistener_Tcpserver - Fatal编程技术网

C#同时有多个TCP客户端

C#同时有多个TCP客户端,c#,sockets,tcpclient,tcplistener,tcpserver,C#,Sockets,Tcpclient,Tcplistener,Tcpserver,我遵循了msdn页面上的tcpclient和tcplistener示例: 我正在尝试连接到我有tcp echo服务器的一些硬件。我可以创建一个TCP客户端并连接到一块板,发送和接收带有毫秒延迟的回波全通径。我可以通过毫秒延迟自行连接到第二块电路板。我不能同时连接到两个电路板并发送带有响应的字符串,即使我只执行一次并返回到循环外 我基本上以异步客户机为例,添加了一些代码,用一个按钮启动它: private void button1_Click(object sender, EventArg

我遵循了msdn页面上的tcpclient和tcplistener示例:

我正在尝试连接到我有tcp echo服务器的一些硬件。我可以创建一个TCP客户端并连接到一块板,发送和接收带有毫秒延迟的回波全通径。我可以通过毫秒延迟自行连接到第二块电路板。我不能同时连接到两个电路板并发送带有响应的字符串,即使我只执行一次并返回到循环外

我基本上以异步客户机为例,添加了一些代码,用一个按钮启动它:

    private void button1_Click(object sender, EventArgs e)
    {
        AsynchronousClient client1 = new AsynchronousClient();
        AsynchronousClient client2 = new AsynchronousClient();

        client1.Begin("192.168.1.10");
        Thread.Sleep(5000);
        client2.Begin("192.168.1.11");
    }
这个密码死了。最后,我希望能够连接到我的一些硬件,每隔一秒钟左右发送一次请求,以查询它们可能积累的数据。我认为我对tcp的理解不够好,无法实现这一点,但我认为我应该能够与两个客户机异步通信。我已经尝试过用线程、任务和我能想到的任何东西来实现这一点,但我无法用我的应用程序同时可靠地与两台服务器通信。任何见解都会有所帮助。谢谢

编辑:

这是我现在使用的。这样做安全吗?我还没有写任何错误处理。另外,我是一名硬件工程师,不生活在c#世界,我正在努力学习如何正确使用这种语言

using System;
using System.Net.Sockets;
using System.Diagnostics;
using System.Threading;
using System.Collections.Generic;
using System.Linq;

namespace Swordfish
{
    class SwordfishClient
    {
        private static ManualResetEvent connectDone = new ManualResetEvent(false);
        private static ManualResetEvent sendDone = new ManualResetEvent(false);
        private static ManualResetEvent receiveSizeDone = new ManualResetEvent(false);
        private static ManualResetEvent receiveMessageDone = new ManualResetEvent(false);
        private static ManualResetEvent parsedDataDone = new ManualResetEvent(false);

        Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        byte[] Size = new byte[2];
        byte[] Message = new byte[1024];

        public event Action<InPacket> NewPacket;

        public void Connect(string address, int port)
        {
            if (!client.Connected)
            {
                try
                {
                    client.BeginConnect(address, port, new AsyncCallback(ConnectCallback), client);
                    connectDone.WaitOne();
                }
                catch
                {
                    return;
                }
            }
        }

        public void SendMessage(byte[] data)
        {
            if (client.Connected)
            {
                sendDone.Reset();
                client.BeginSend(data, 0, data.Length, 0, new AsyncCallback(SendCallback), client);      
                Trace.WriteLine("Waiting on SendCallback: " + sendDone.WaitOne());

                receiveSizeDone.Reset();
                client.BeginReceive(Size, 0, 2, 0, new AsyncCallback(ReceiveSizeCallback), client);                          
                Trace.WriteLine("Waiting on ReceiveSizeCallback: " + receiveSizeDone.WaitOne());

                receiveMessageDone.Reset();
                client.BeginReceive(Message, 0, BitConverter.ToUInt16(Size, 0), 0, new AsyncCallback(ReceiveMessageCallback), client);               
                Trace.WriteLine("Waiting on ReceiveMessageCallback: " + receiveMessageDone.WaitOne());

                parsedDataDone.Reset();
                parsePacket(Message, BitConverter.ToUInt16(Size, 0));
                parsedDataDone.WaitOne();         
            }
        }

        private static void ConnectCallback(IAsyncResult ar)
        {
            Socket client = (Socket)ar.AsyncState;
            client.EndConnect(ar);
            connectDone.Set();
        }

        private static void ReceiveSizeCallback(IAsyncResult ar)
        {
            Socket client = (Socket)ar.AsyncState;
            int bytesRead = client.EndReceive(ar);

            Trace.WriteLine("-------------------");
            Trace.WriteLine("Received Header Size: " + bytesRead);

            if (bytesRead > 0)
            {
                receiveSizeDone.Set();
            }
        }

        private static void ReceiveMessageCallback(IAsyncResult ar)
        {
            Socket client = (Socket)ar.AsyncState;
            int bytesRead = client.EndReceive(ar);

            Trace.WriteLine("-------------------");
            Trace.WriteLine("Received Message Size: " + bytesRead);

            if (bytesRead > 0)
            {
                receiveMessageDone.Set();
            }
        }

        private static void SendCallback(IAsyncResult ar)
        {
            Socket client = (Socket)ar.AsyncState;
            int bytesSent = client.EndSend(ar);
            Trace.WriteLine("-------------------");
            Trace.WriteLine("Bytes Sent: " + bytesSent);
            sendDone.Set();
        }

        private void parsePacket(byte[] data, int size)
        {
            Queue<byte> receivedBytes = new Queue<byte>();
            for (int i = 0; i < size - 2; i++)
            {
                receivedBytes.Enqueue(data[i]);
            }

            byte[] statusBytes = Enumerable.Range(0, 2).Select(i => receivedBytes.Dequeue()).ToArray();
            StatusCode status = (StatusCode)Enum.ToObject(typeof(StatusCode), BitConverter.ToUInt16(statusBytes, 0));

            byte[] messageBytes = Enumerable.Range(0, size - 4).Select(i => receivedBytes.Dequeue()).ToArray();

            NewPacket.Invoke(new InPacket(status, messageBytes));


            Trace.WriteLine("-------------------");
            Trace.WriteLine("Size: " + size);
            Trace.WriteLine("-------------------");
            Trace.WriteLine("Status: " + status);
            Trace.WriteLine("-------------------");

            for (int i = 0; i < data.Length; i++)
            {
                Trace.Write(data[i] + " ");
                if (i> 0 && i % 75 == 0)
                    Trace.WriteLine("");

                if(i == size - 2)
                    Trace.WriteLine("\r\n----------End of Message: This should all be zero------");
            }
            Trace.WriteLine("\r\n----------------------------------------------------------\r\n");

            for(int i =0; i < Message.Length; i++)
            {
                Message[i] = 0;
            }

            parsedDataDone.Set();
        }
    }
}

Took 7.5514 milliseconds to connect.
-------------------
Bytes Sent: 2
Waiting on SendCallback: True
-------------------
Received Header Size: 2
Waiting on ReceiveSizeCallback: True
-------------------
Received Message Size: 236
Waiting on ReceiveMessageCallback: True
-------------------
Size: 238
-------------------
Status: STATUS_LOG
-------------------
6 0 3 91 69 84 72 69 82 78 69 84 93 32 65 99 99 101 112 116 101 100 32 99 111 110 110 101 99 116 105 111 110 32 102 114 111 109 32 49 48 46 54 52 46 49 46 49 48 58 50 52 53 48 57 32 45 62 32 112 111 114 116 32 53 48 48 48 48 10 23 3 91 69 84 72 
69 82 78 69 84 93 32 65 99 99 101 112 116 101 100 32 99 111 110 110 101 99 116 105 111 110 32 102 114 111 109 32 49 48 46 54 52 46 49 46 49 48 58 50 52 53 49 48 32 45 62 32 112 111 114 116 32 53 48 48 48 49 10 23 3 91 69 84 72 69 82 78 69 84 93 
32 84 114 121 105 110 103 32 116 111 32 99 111 110 110 101 99 116 32 116 111 32 49 48 46 54 52 46 49 46 49 48 58 53 48 48 48 50 10 23 1 91 114 101 99 118 95 99 97 108 108 98 97 99 107 93 32 103 111 116 32 50 32 98 121 116 101 115 32 111 110 32 99 111 110 
102 105 103 32 112 111 114 116 10 23 0 
----------End of Message: This should all be zero------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
----------------------------------------------------------

[ETHERNET] Accepted connection from 10.64.1.10:24509 -> port 50000
[ETHERNET] Accepted connection from 10.64.1.10:24510 -> port 50001
[ETHERNET] Trying to connect to 10.64.1.10:50002
[recv_callback] got 2 bytes on config port
使用系统;
使用System.Net.Sockets;
使用系统诊断;
使用系统线程;
使用System.Collections.Generic;
使用System.Linq;
旗鱼
{
类swardfishclient
{
专用静态手动复位事件连接完成=新手动复位事件(错误);
专用静态手动复位事件sendDone=新手动复位事件(false);
private static ManualResetEvent ReceiveSizeOne=新的ManualResetEvent(假);
private static ManualResetEvent receiveMessageDone=新的ManualResetEvent(错误);
私有静态ManualResetEvent ParsedDataOne=新的ManualResetEvent(假);
Socket client=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
字节[]大小=新字节[2];
字节[]消息=新字节[1024];
公共事件行动;
公共void连接(字符串地址,int端口)
{
如果(!client.Connected)
{
尝试
{
BeginConnect(地址、端口、新异步回调(ConnectCallback)、客户端);
connectDone.WaitOne();
}
接住
{
回来
}
}
}
公共无效发送消息(字节[]数据)
{
如果(客户端已连接)
{
sendDone.Reset();
client.BeginSend(data,0,data.Length,0,新的异步回调(SendCallback),client);
WriteLine(“正在等待SendCallback:+sendDone.WaitOne());
receiveSizeDone.Reset();
BeginReceive(大小,0,2,0,新异步回调(ReceiveSizeCallback),客户端);
WriteLine(“正在等待ReceiveSizeCallback:+receiveSizeDone.WaitOne());
receiveMessageDone.Reset();
client.BeginReceive(Message,0,BitConverter.ToUInt16(Size,0),0,new-AsyncCallback(ReceiveMessageCallback),client);
WriteLine(“正在等待ReceiveMessageCallback:+receiveMessageDone.WaitOne());
parsedDataDone.Reset();
parsePacket(消息,BitConverter.ToUInt16(大小,0));
parsedDataDone.WaitOne();
}
}
专用静态无效连接回调(IAsyncResult ar)
{
套接字客户端=(套接字)ar.AsyncState;
客户端.EndConnect(ar);
connectDone.Set();
}
私有静态void ReceiveSizeCallback(IAsyncResult ar)
{
套接字客户端=(套接字)ar.AsyncState;
int bytesRead=client.EndReceive(ar);
Trace.WriteLine(“------------------------”;
Trace.WriteLine(“接收到的头大小:+ByteRead”);
如果(字节读取>0)
{
receiveSizeDone.Set();
}
}
私有静态void ReceiveMessageCallback(IAsyncResult ar)
{
套接字客户端=(套接字)ar.AsyncState;
int bytesRead=client.EndReceive(ar);
Trace.WriteLine(“------------------------”;
Trace.WriteLine(“接收到的消息大小:+bytesRead”);
如果(字节读取>0)
{
receiveMessageDone.Set();
}
}
私有静态void SendCallback(IAsyncResult ar)
{
套接字客户端=(套接字)ar.AsyncState;
int bytesent=client.EndSend(ar);
Trace.WriteLine(“------------------------”;
Trace.WriteLine(“发送的字节数:“+bytesSent”);
sendDone.Set();
}
专用数据包(字节[]数据,整数大小)
{
Queue receivedBytes=新队列();
对于(int i=0;ireceivedBytes.Dequeue()).ToArray();
StatusCode status=(StatusCode)Enum.ToObject(typeof(StatusCode),BitConverter.ToUInt16(statusBytes,0));
byte[]messageBytes=Enumerable.Range(0,大小-4)。选择(i=>receivedBytes.Dequeue()).ToArray();
Invoke(newinpacket(status,messageBytes));
Trace.WriteLine(“------------------------”;
Trace.WriteLine(“大小:+Size”);
Trace.WriteLine(“------------------------”;
Trace.WriteLine(“状态:+状态”);
Trace.WriteLine(“------------------------”;
for(int i=0;i