public void close(ClientBean cb) { if (OnDisconnect != null) { OnDisconnect(cb); } cb.client.Close(); Debug.WriteLine("Socket Closed"); }
protected void SendCallBack(IAsyncResult iar) { ClientBean cb = (ClientBean)iar.AsyncState; int bytesent; try { bytesent = cb.client.EndSend(iar); } catch { bytesent = 0; } if (bytesent != 0) { Debug.WriteLine("Send " + bytesent); } else { Debug.WriteLine("Send Err. Bad Net."); } }
protected void AcceptCallBack(IAsyncResult iar) { Socket listener = (Socket)iar.AsyncState; Socket client = listener.EndAccept(iar); Debug.WriteLine("Accepted."); ClientBean cb = new ClientBean(client); if (OnAccept != null) { OnAccept(cb); } client.BeginReceive(cb.recvBuff, 0, RECV_BUFF_SIZE, SocketFlags.None, RecvCallBack, cb); listener.BeginAccept(AcceptCallBack, listener); }
protected void RecvCallBack(IAsyncResult iar) { ClientBean cb = (ClientBean)iar.AsyncState; int bytesRecved = 0; try { bytesRecved = cb.client.EndReceive(iar); } catch { bytesRecved = 0; } if (bytesRecved > 0) { byte[] msg = findValidMsg(cb, bytesRecved); while (msg != null) { if (OnRecv != null) { OnRecv(cb, msg); } msg = findValidMsg(cb, 0); } try { cb.client.BeginReceive(cb.recvBuff, cb.recvBuffOffset, RECV_BUFF_SIZE - cb.recvBuffOffset, SocketFlags.None, RecvCallBack, cb); } catch { this.close(cb); } } else { //抢救一下 Debug.WriteLine("RECV ERR"); if (!IsOnline(cb.client)) { this.close(cb); } else { try { cb.client.BeginReceive(cb.recvBuff, cb.recvBuffOffset, RECV_BUFF_SIZE - cb.recvBuffOffset, SocketFlags.None, RecvCallBack, cb); } catch { this.close(cb); } } } }
public void Send(ClientBean cb, String msg) { this.Send(cb, Encoding.Default.GetBytes(msg)); }
public void Send(ClientBean cb, byte[] msg) { this.Send(cb, msg, 0, msg.Length); }
public void Send(ClientBean cb, byte[] msg, int offset, int size) { byte[] packedMsg = packMsg(msg, offset, size); try { cb.client.BeginSend(packedMsg, 0, packedMsg.Length, SocketFlags.None, SendCallBack, cb); } catch { this.close(cb); } }
protected byte[] findValidMsg(ClientBean cb, int bytesRecved) { cb.recvBuffOffset += bytesRecved; byte[] msg = cb.recvBuff; //check head if (cb.recvBuffOffset < HEAD.Length) { return(null); } for (int i = 0; i < HEAD.Length; i++) { if (HEAD[i] != msg[i]) { //error head cb.recvBuffOffset = 0; return(null); } } //check size if (cb.recvBuffOffset < HEAD.Length + sizeof(int)) { return(null); } int msgSize = BitConverter.ToInt32(msg, HEAD.Length); //check tail int expectedLen = HEAD.Length + sizeof(int) + msgSize + TAIL.Length; if (expectedLen > cb.recvBuffOffset) { return(null); } for (int i = 0; i < TAIL.Length; i++) { if (TAIL[i] != msg[HEAD.Length + sizeof(int) + msgSize + i]) { //error tail cb.recvBuffOffset = 0; return(null); } } //copy checked msg byte[] result; if (msgSize > 0) { result = new byte[msgSize]; Array.Copy(msg, HEAD.Length + sizeof(int), result, 0, msgSize); } else { result = null; } //format buffer if neccessary if (cb.recvBuffOffset > expectedLen) { Array.Copy(msg, expectedLen, msg, 0, cb.recvBuffOffset - expectedLen); cb.recvBuffOffset -= expectedLen; } else { cb.recvBuffOffset = 0; } return(result); }