/// <summary> /// 释放SOCKET资源与关闭 /// </summary> private void ShutdownAndDisposeSocket() { if (SrvSocket != null) { SrvSocket.Shutdown(SocketShutdown.Both); SrvSocket.Close(); SrvSocket = null; } }
/// <summary> /// 同步连接 /// </summary> /// <param name="strIP"></param> /// <param name="iPort"></param> public void BuildServerSocket(string strIP, int iPort) { try { if (SrvSocket == null) { SrvSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } if (SrvSocket.Connected) { if (SrvSocket.RemoteEndPoint.ToString() != strIP + ":" + iPort.ToString()) { SrvSocket.Disconnect(true); } } if (!SrvSocket.Connected) { //从配置文件获取ip地址和端口号 IPEndPoint _ipep = BuildIPEndPoint(strIP, iPort); if (_ipep != null) { //AsyncCallback callback = new AsyncCallback(ConnectCallback); SrvSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //SrvSocket.BeginConnect(_ipep, callback, SrvSocket); //尝试连接 try { SrvSocket.Connect(_ipep); } //异常处理 catch (SocketException e) { OnSocketException(new SyncTCPClientEventArgs("连接失败", SrvSocket), "connect err"); return; } if (SrvSocket.Connected) { OnClientConnected(new SyncTCPClientEventArgs("已经成功连接到服务器", SrvSocket), "server cnonnect"); } SyncReceiveData(); } } } catch { OnOtherException(new SyncTCPClientEventArgs("创建连接失败", SrvSocket), "connect err"); return; } }
//发送数据回调 private void SendCallback(IAsyncResult ar) { try { int sendNum = SrvSocket.EndSend(ar); //结束挂起的异步发送 //System.Diagnostics.Debug.WriteLine("向Socket发送字节数:" + sendNum.ToString()); } catch { ShutdownAndDisposeSocket(); //System.Diagnostics.Debug.WriteLine("服务器断开了TCP连接!"); } }
private void ReceiveCallback(IAsyncResult ar) { try { int iDataLen = SrvSocket.EndReceive(ar); //这是接收回来的数据长度 if (iDataLen > 0) { _bReceiveData = new byte[iDataLen]; //存放已经接收返回的数据 Array.Copy(Rcvbuffer, 0, _bReceiveData, 0, _bReceiveData.Length); //重新创建一个接收缓冲区 //DataProcess(_bReceiveData); //ReceiveData = _bReceiveData; //ReceiveEvent.Set(); OnDataReceived(new AsyncTCPClientEventArgs("data receive", SrvSocket), _bReceiveData); //AsyncCallback callback = new AsyncCallback(ReceiveCallback); //_srvSocket.BeginReceive(Rcvbuffer, 0, Rcvbuffer.Length, SocketFlags.None, callback, _srvSocket); } else { ShutdownAndDisposeSocket(); OnSocketException(new AsyncTCPClientEventArgs("服务器已断开连接", SrvSocket), "server err"); } } catch (SocketException ex) { ShutdownAndDisposeSocket(); OnSocketException(new AsyncTCPClientEventArgs("服务器已断开连接", SrvSocket), "server err"); LogHelpr.Error("服务器已断开连接:" + ex.ToString()); } catch (Exception ex) { OnOtherException(new AsyncTCPClientEventArgs("服务器已断开连接", SrvSocket), "other err"); LogHelpr.Error("服务器已断开连接:" + ex.ToString()); } finally { if (SrvSocket != null && SrvSocket.Connected == true) { Rcvbuffer = new byte[MaxBufLen]; AsyncCallback callback = new AsyncCallback(ReceiveCallback); SrvSocket.BeginReceive(Rcvbuffer, 0, Rcvbuffer.Length, SocketFlags.None, callback, SrvSocket); } } }