Ik probeer 2 test programma's async via sockets met elkaar te laten praten. Over asynchroon data ontvangen is veel te vinden en ik denk ook dat die code goed is, maar over async verzenden kan ik geen goede documentatie vinden, op dit moment krijg ik een nullrefexception in de app die de data stuurt en een socketclosedexception in de app die de data ontvangt op het moment dat ik ze met elkaar probeer te laten communiceren.
Het listen/accept/connected gedeelte gaat wel goed, de code van de 'server' komt zonder fouten in de "OnDataReceived" methode die ik gedefinieerd heb, maar de 'client' faalt op dat moment.
De client ziet er zo uit:
De server lijkt alles goed te doen maar voor de zekerheid wil ik daar ook de relevante code even van posten
Op MSDN staat helaas geen voorbeeld code http://msdn.microsoft.com...ket.sendpacketsasync.aspx en ik wil dit graag allemaal non-blocking hebben en dus echt Async senden, hier kan ik ook geen goede voorbeelden van vinden. Ik heb zowel SendAysync als SendPacketsAsync geprobeerd (ik denk dat ik de laatste moet hebben). Maar dit maakt geen verschil in foutmeldingen.
Wie o wie weet welk stukje code de fout in gaat waardoor ik geen data kan verzenden/ontvangen.
(oh het classje Packet dat je af en toe ziet heeft de volgende signature)
Het listen/accept/connected gedeelte gaat wel goed, de code van de 'server' komt zonder fouten in de "OnDataReceived" methode die ik gedefinieerd heb, maar de 'client' faalt op dat moment.
De client ziet er zo uit:
C#:
1
2
3
4
5
6
7
8
9
10
| sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint address = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1440); sender.Connect(address); if (sender.Connected) //code komt netjes hier in { Packet p = new Packet(); p.msg = "Hello Webs"; sender.SendPacketsAsync(p); //bij het aanroepen van deze methode gaat het fout! Console.Out.WriteLine("Message send!!"); } |
De server lijkt alles goed te doen maar voor de zekerheid wil ik daar ook de relevante code even van posten
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| public void StartServer() { IPEndPoint address = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1440); listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(address); listener.Listen(1000); while (true) { allDone.Reset(); //ManualResetEvent dat er voor zorgt dat het thread halt totdat iemand connect Console.Out.WriteLine("Waiting for a connection..."); listener.BeginAccept(OnConnect, null); allDone.WaitOne(); } } private void OnConnect(IAsyncResult result) { try { Socket socket = listener.EndAccept(result); Packet packet = new Packet(); packet.socket = socket; socket.BeginReceive(packet.dataBuffer, 0, packet.dataBuffer.Length, SocketFlags.None, OnReceive, packet); } //snip catches } private void OnReceive(IAsyncResult result) { Packet packet = result.AsyncState as Packet; int status = packet.socket.EndReceive(result); Console.Out.WriteLine(packet.msg); } |
Op MSDN staat helaas geen voorbeeld code http://msdn.microsoft.com...ket.sendpacketsasync.aspx en ik wil dit graag allemaal non-blocking hebben en dus echt Async senden, hier kan ik ook geen goede voorbeelden van vinden. Ik heb zowel SendAysync als SendPacketsAsync geprobeerd (ik denk dat ik de laatste moet hebben). Maar dit maakt geen verschil in foutmeldingen.
Wie o wie weet welk stukje code de fout in gaat waardoor ik geen data kan verzenden/ontvangen.
(oh het classje Packet dat je af en toe ziet heeft de volgende signature)
C#:
1
2
3
4
5
6
| public class Packet : SocketAsyncEventArgs { public string msg; public Socket socket; public byte[] dataBuffer = new byte[1]; } |