void _bw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { int p = (int)e.Argument; // run until client stopped while (_started) { // quit thread if requested if (e.Cancel) { _started = false; break; } bool connected = server.Connected; try { int ret = server.Receive(buffer, bufferoffset, buffer.Length - bufferoffset, SocketFlags.None); if (ret > 0) { #if DEBUG // notify v("client received bytes: " + ret + " raw data: " + HexToString(buffer, ret)); #endif // get messages from data Message[] msgs = Message.gotmessages(ref buffer, ref bufferoffset); // handle messages for (int i = 0; i < msgs.Length; i++) { #if DEBUG v("client message#" + i + " type: " + msgs[i].Type + " content: " + msgs[i].Content); #endif handle(msgs[i].Type, msgs[i].Content); } } else if (ret == 0) // socket was shutdown { connected = issocketconnected(server); } } catch (SocketException ex) { v("socket exception: " + ex.SocketErrorCode + ex.Message + ex.StackTrace); } catch (Exception ex) { debug(ex.Message + ex.StackTrace); } if (_connect && ((server == null) || !connected)) { if ((p >= 0) && (p < serverip.Count)) { markdisconnect(); debug("client lost connection to server: " + serverip[p]); } if (connect(p, false)) { debug("recovered connection to: " + serverip[p]); } else { debug("unable to recover connection to: " + serverip[p]); } } } }
void ReadData(IAsyncResult ir) { //get our state socketinfo csi = (socketinfo)ir.AsyncState; bool connected = csi.sock.Connected; try { SocketError se = SocketError.Success; // see how much data was read for this call int len = csi.sock.EndReceive(ir, out se); // receive any data if (len > 0) { try { // get messages from data v("srv data received: socket_status: " + se.ToString() + " data size: " + csi.freebuffersize + " data: " + HexToString(csi.buffer, len)); Message[] msgs = Message.gotmessages(ref csi.buffer, ref csi.startidx); v("srv messages received: " + msgs.Length + " messages. "); // handle messages for (int i = 0; i < msgs.Length; i++) { Message m = msgs[i]; v("srv message# " + i + " size: " + m.ByteLength + " type: " + m.Type + " tag: " + m.Tag + " data: " + m.Content); handle(m.Type, m.Content, csi.sock); } v("srv handled " + msgs.Length + " messages."); } catch (Exception ex) { debug(ex.Message + ex.StackTrace); } } else { // implies possible disconnect, verify connected = issocketconnected(csi.sock); } } catch (SocketException ex) { debug(ex.SocketErrorCode + ex.Message + ex.StackTrace); } catch (Exception ex) { debug(ex.Message + ex.StackTrace); } try { // wait for more data to arrive if (connected) { Thread.Sleep(100); csi.sock.BeginReceive(csi.buffer, csi.startidx, csi.freebuffersize, SocketFlags.None, new AsyncCallback(ReadData), csi); } else { csi.sock.Close(); } } catch (SocketException ex) { // host likely disconnected v("disconnected. msg: " + ex.SocketErrorCode + ex.Message + ex.StackTrace); csi.sock.Close(); } }