visual studio socket sharp read futbol app c# network-programming networkstream

sharp - socket c# visual studio



Llamar a BeginRead desde un NetworkStream (1)

Ok, quiero conectarme a un Socket y leer un flujo de red usando la clase System.Net.Sockets.NetworkStream . Esto es lo que tengo hasta ahora:

NetworkStream myNetworkStream; Socket socket; socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IPv4); socket.Connect(IPAddress.Parse("8.8.8.8"), 8888); myNetworkStream = new NetworkStream(socket); byte[] buffer = new byte[1024]; int offset = 0; int count = 1024; myNetworkStream.BeginRead(buffer, offset, count, ??, ??);

Ahora necesito un AsyncCallback y un Object state para completar mi método BeginRead , pero ni siquiera estoy seguro de si esto va a funcionar. Estoy un poco perdido en este punto! ¿A dónde debo ir desde aquí?


Básicamente, cuando llama al método Begin* en una operación asíncrona, debe haber una llamada a la correspondiente instrucción End* (para obtener información más detallada, consulte la Descripción general de la programación asincrónica en MSDN , específicamente la sección titulada "Finalización de una operación asincrónica" )

Dicho esto, generalmente quiere pasar un método / método anónimo / expresión lambda que hará una o dos cosas:

1) Llame al método End* correspondiente, en este caso, Stream.EndRead . Esta llamada no se bloqueará cuando se llame porque la callback no se ejecutará hasta que la operación se complete (tenga en cuenta que si se produjo una excepción durante la llamada asincrónica, esta excepción se lanzará cuando se llame al método End* ).

2) Posiblemente inicie una nueva llamada asincrónica. En este caso, se supone que querrá leer más datos, por lo que debe iniciar una nueva llamada a Stream.BeginRead

Suponiendo que quiere hacer # 2, puede hacer lo siguiente:

// Declare the callback. Need to do that so that // the closure captures it. AsyncCallback callback = null; // Assign the callback. callback = ar => { // Call EndRead. int bytesRead = myNetworkStream.EndRead(ar); // Process the bytes here. // Determine if you want to read again. If not, return. if (!notMoreToRead) return; // Read again. This callback will be called again. myNetworkStream.BeginRead(buffer, offset, count, callback, null); }; // Trigger the initial read. myNetworkStream.BeginRead(buffer, offset, count, callback, null);

Sin embargo, si usa .NET 4.0, esto se vuelve mucho más fácil usando el método FromAsync en la clase TaskFactory .