2016-12-20 3 views
1

Ich portiere derzeit eine Hardwarebibliothek nach .NET Core. Die Kommunikation funktioniert über TCP. Ich habe Probleme mit der 'Socket.BeginReceive'-Methode. MSDNWie bekomme ich Daten von einem Socket in .NET Core?

Es scheint, dass es keine äquivalente Methode in .NET Core gibt. Wie kann ich Daten von einem TCP-Socket empfangen?

private void InternalDataReceived(IAsyncResult ar) 

{ 
    int dataCount = 0; 
    byte[] buffer; 

    try 
    { 
     if (_client != null && _client.Client != null) 
     { 
      dataCount = _client.Client.EndReceive(ar); 
     } 

     if (dataCount > 0) 
     { 
      try 
      { 
       buffer = new byte[dataCount]; 
       Array.Copy(_inBuffer, buffer, dataCount); 

       if (DataReceived != null) 
       { 
        DataReceived(buffer); 
       } 
      } 
      catch (Exception exc) 
      { 
       if (exc is System.Net.Sockets.SocketException) 
       { 
        Disconnect(); 
        return; 
       } 
      } 
      _client.Client.BeginReceive(_inBuffer, 0, _inBuffer.Length, SocketFlags.None, InternalDataReceived, null); 
     } 
    } 
    catch 
    { 
     Disconnect(); 
    } 
} 
+0

Es gibt [Synchron] (https://docs.microsoft.com/en-us/dotnet/core/api/system.net.sockets. Socket # System_Net_Sockets_Socket_Receive_System_Byte ___) und [asynchrone] (https://docs.microsoft.com/en-us/dotnet/core/api/system.net.sockets.socket#System_Net_Sockets_Socket_ReceiveAsync_System_Net_Sockets_SocketAsyncEventArgs_) Versionen von Receive in .NET Core. –

Antwort

1

Ich fand einen anderen Weg, es zu tun. Hoffe das hilft jemand anderem.

Grundsätzlich habe ich gerade die NetworkStream Klasse verwendet. Sie können eine Instanz abrufen, indem Sie TcpClient.GetStream() aufrufen. Wenn Sie einen using Block mit GetStream verwenden, wird Ihre Verbindung nach dem using geschlossen. Deshalb verwende ich es nicht in meinem Beispiel, weil ich die Verbindung brauche, um am Leben zu bleiben.

MSDN NetworkStream.Read

Mein Beispielcode:

static void Main(string[] args) 
{ 
    TcpClient client = new TcpClient(); 

    client.Client.Connect(IPAddress.Parse("192.168.100.5"), 8000); 

    //Task.Run(() => ReadData(client)); 

    Task.Run(() => ReadDataLoop(client)); 

    client.Client.Send(Encoding.ASCII.GetBytes("{\"TID\":1111,\"blabla\":{}}")); 


    while (true) 
    { 

    } 
} 

private static void ReadDataLoop(TcpClient client) 
{ 
    while (true) 
    { 
     if (!client.Connected) 
      break; 

     string xxx = ""; 
     xxx = ReadData(client); 
     Console.WriteLine(xxx); 
    } 
} 

private static string ReadData(TcpClient client) 
{ 
    string retVal; 
    byte[] data = new byte[1024]; 

    NetworkStream stream = client.GetStream(); 


    byte[] myReadBuffer = new byte[1024]; 
    StringBuilder myCompleteMessage = new StringBuilder(); 
    int numberOfBytesRead = 0; 


    do 
    { 
     numberOfBytesRead = stream.Read(myReadBuffer, 0, myReadBuffer.Length); 

     myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); 

    } 
    while (stream.DataAvailable); 



    retVal = myCompleteMessage.ToString(); 


    return retVal; 
} 
Verwandte Themen