Ik ben bezig met het ontwikkelen van een MSNBot die oorspronkelijk gebruik maakte van DotMSN om te communiceren met het .Net Messenger-netwerk. Helaas is deze library wat out-of-date, dus besloot 'k hem zelf maar op te waarderen naar het laatste protocol (MSNP11).
Nu zit ik met het volgende probleem:
In ongeveer 75% van de gevallen dat ik mijn programma run (dus soms lukt het ook gewoonweg wel, maar het meest van al niet), loopt hij steeds vast na een bepaald commando. Het rare is dat dit probleem erg diep terugvoert als ik hem probeer te debuggen. Waar ik op uitkom is dat achter het pakket dat de socket ontvangt met dat commando, dat hij dan een hele tijd wacht op nieuwe data, en dan maar uiteindelijk de socket sluit (datalength = 0).
Echter, als ik met Etherdetect de inkomende packets in de gaten hou, dan zie ik dat er WEL nieuwe paketten toekomen, echter, de socket slaagt er blijkbaar niet in deze op te halen...
Hieronder de code die het probleem vormt:
De volledige library staat ter jullie beschikking op http://www.tombotxp.net/WLMConnector.rar . Het bestand waar ik vermoed dat het probleem zit (en waar bovenstaande snippets uit komen dus) is Core\SocketMessageProcessor.cs
Het type socket dat gebruikt wordt is ProxySocket, afkomstig van Mentalis.org, echter, ik heb al heel dit stuk van de DotMSN-library herschreven mbv TcpClient, en ook dit bracht geen zoden aan de dijk
Alvast bedankt voor alle moeite!
Nu zit ik met het volgende probleem:
In ongeveer 75% van de gevallen dat ik mijn programma run (dus soms lukt het ook gewoonweg wel, maar het meest van al niet), loopt hij steeds vast na een bepaald commando. Het rare is dat dit probleem erg diep terugvoert als ik hem probeer te debuggen. Waar ik op uitkom is dat achter het pakket dat de socket ontvangt met dat commando, dat hij dan een hele tijd wacht op nieuwe data, en dan maar uiteindelijk de socket sluit (datalength = 0).
Echter, als ik met Etherdetect de inkomende packets in de gaten hou, dan zie ik dat er WEL nieuwe paketten toekomen, echter, de socket slaagt er blijkbaar niet in deze op te halen...
Hieronder de code die het probleem vormt:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
| /// <summary> /// Starts an a-synchronous receive. /// </summary> /// <param name="socket"></param> protected virtual void BeginDataReceive(Socket socket) { // now go retrieve data socketBuffer = new byte[socketBuffer.Length]; socket.BeginReceive(socketBuffer, 0, socketBuffer.Length, SocketFlags.None, new AsyncCallback(EndReceiveCallback), socket); } /// <summary> /// The callback used by the Socket.BeginReceive method. /// </summary> /// <param name="ar">The used socket.</param> protected virtual void EndReceiveCallback(IAsyncResult ar) { int cnt = 0; try { System.Diagnostics.Debug.Assert(messagePool != null, "Field messagepool must be defined in derived class of SocketMessageProcessor."); Socket socket = (Socket)ar.AsyncState; SocketError error; cnt = socket.EndReceive(ar, out error); if(cnt == 0) { Console.WriteLine("No data --> diconnected: " + error.ToString()); // No data is received. We are disconnected. OnDisconnected(); return; } // read the messages and dispatch to handlers using(BinaryReader reader = new BinaryReader(new MemoryStream(socketBuffer, 0, cnt))) { messagePool.BufferData(reader); } while(messagePool.MessageAvailable) { // retrieve the message byte[] incomingMessage = messagePool.GetNextMessageData(); // call the virtual method to perform polymorphism, descendant classes can take care of it OnMessageReceived(incomingMessage); } // start a new read BeginDataReceive(socket); } catch(SocketException e) { // close the socket upon a exception if(socket != null && socket.Connected) socket.Close(); OnDisconnected(); // an exception Occurred, pass it through if(ConnectionException != null) ConnectionException(this, new ExceptionEventArgs(new ConnectivityException("SocketMessageProcessor encountered a socket exception while retrieving data. See the inner exception for more information.",e))); } catch(ObjectDisposedException) { // the connection is closed OnDisconnected(); } catch(Exception e) { // close the socket upon a exception if(socket != null && socket.Connected) socket.Close(); if(Settings.TraceSwitch.TraceError) System.Diagnostics.Trace.WriteLine(e.ToString() + "\r\n" + e.StackTrace + "\r\n", "SocketMessageProcessor"); OnDisconnected(); if(ConnectionException != null) ConnectionException(this, new ExceptionEventArgs(new ConnectivityException("SocketMessageProcessor encountered a general exception while retrieving data. See the inner exception for more information.",e))); } } |
De volledige library staat ter jullie beschikking op http://www.tombotxp.net/WLMConnector.rar . Het bestand waar ik vermoed dat het probleem zit (en waar bovenstaande snippets uit komen dus) is Core\SocketMessageProcessor.cs
Het type socket dat gebruikt wordt is ProxySocket, afkomstig van Mentalis.org, echter, ik heb al heel dit stuk van de DotMSN-library herschreven mbv TcpClient, en ook dit bracht geen zoden aan de dijk
Alvast bedankt voor alle moeite!