在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#网络编程 → c#通讯实例,socket的select模型,多通道及文件生成

c#通讯实例,socket的select模型,多通道及文件生成

C#网络编程

下载此实例
  • 开发语言:C#
  • 实例大小:0.31M
  • 下载次数:71
  • 浏览次数:651
  • 发布时间:2016-11-08
  • 实例类别:C#网络编程
  • 发 布 人:qiufushuang
  • 文件格式:.rar
  • 所需积分:2
 相关标签: Socket 实例 C# 文件 通讯

实例介绍

【实例简介】c#通讯实例,socket的select模型,多通道及文件生成
【实例截图】
【核心代码】
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using SGAI.GrindCom.Proxy.Utilities;
using System.Reflection;

namespace SGAI.GrindCom.Proxy.Net
{
    public class TcpClientChannel : TcpChannelBase
    {
        #region 字段

        public event EventHandler<SocketArgs> Errormanager;

        #endregion

        #region 属性

        public sendTelegramStr SendTelegramStr
        {
            get { return SendtelegramStr; }
            set { SendtelegramStr = value; }
        }

        public sendTelegramByte SendTelegramByte
        {
            get { return SendtelegramByte; }
            set { SendtelegramByte = value; }
        }

        public sendErrorMsg SendErrorMsg
        {
            get { return SendErrormsg; }
            set { SendErrormsg = value; }
        }


        #endregion

        #region 构造函数

        public TcpClientChannel(AddressFamily addressFamily, System.Net.Sockets.SocketType socketType, ProtocolType protocolType, int length, int reconnecttime, int healthtime)
            : base(addressFamily, socketType, protocolType, length)
        {
            this.error_occurred = false;
            this.reconnecttime = reconnecttime;
            this.healthtime = healthtime;
        }

        #endregion

        #region 接口函数

        public override void OnRead()
        {
            SyncReceiveData();
        }

        public override void OnSend()
        {
            if (socketState == SocketState.Disconnected || socketState == SocketState.WaitingForConnect)
            {
                socketState = SocketState.Connected;
                OnLastOperCompeleted();
                //Logger.WriteInfo("This ClientSocket success ");
            }
            else
            {
            }
        }

        public override void OnError()
        {
            ErrorStartTime = DateTime.Now;
            this.socketState = SocketState.Disconnected;
            //Logger.WriteInfo("This ClientSocket Can not connect!");
        }

        #endregion

        #region 同步处理

        #region 同步处理接口函数
        public override bool SyncStart(IpEndPoint iep,ref string msg)
        {
            return OnSyncStart(iep,ref msg);
        }

        public override bool SyncDataSend(byte[] data,ref string msg)
        {
            bool ret = false;
            ret = DataSend(data,ref msg);
            return ret;
        }

        private bool DataSend(byte[] data,ref string msg)
        {
            bool ret = false;
            if (socketState == SocketState.Connected)
            {
                try
                {
                    base.Send(data);
                    OnLastOperCompeleted();
                    ret = true;
                    msg = "发送数据成功!";//send data ok !
                }
                catch (ArgumentNullException ae)
                {
                    msg = ae.Message;
                    ret = false;
                }
                catch (SocketException se)
                {
                    if (se.NativeErrorCode.Equals(10035))
                    {
                        socketState = SocketState.WritingData;

                        ret = true;
                    }
                    else
                    {
                        msg = se.Message;
                        OnSendError();
                        ret = false;
                    }
                }
                catch (ObjectDisposedException)
                {
                    msg = "客户端已经关闭!";//ClientSocket is already close
                    ret = false;
                }
            }
            else
            {
                ret = false;
            }
            return ret;
        }

        public override void SyncReceiveData()
        {
            OnReceiveData();
        }

        private void OnReceiveData()
        {
            int curRcv = 0;
            string msg = null;
            try
            {
                curRcv = this.Receive(Buffer, 0, Buffer.Length, SocketFlags.None);

                if (curRcv > 1)
                {
                    this.OnLastOperCompeleted();
                    OnReceivedDataCompleted();
                    //this.socketState = SocketState.Connected;
                }
                else
                {
                    if (curRcv == 0)
                    {
                        msg = "远短可能已经关闭或发送的为错误数据!";//remote socket maybe close or send error data !
                        OnReceiveError(msg);
                    }
                }
            }
            catch (ObjectDisposedException)
            {
                msg = "工作套接字已经关闭!";//the work socket is already close !
                OnReceiveError(msg);
            }
            catch (SocketException e)
            {
                if (e.NativeErrorCode == 10054)
                {
                    msg = "远端连接已经断开多压根就没连接!";//the remote socket connection maybe already break or never established !
                    OnReceiveError(msg);
                }
                else
                {
                    msg = e.Message;
                    OnReceiveError(msg);
                }
            }
        }

        private void OnReceivedDataCompleted()
        {
            try
            {
                OnSendTelegram(this.Buffer);
            }
            catch (Exception de)
            {
                ErrorMsgManager(de.Message);
            }
        }

        #endregion

        #endregion

        #region 内部同步处理函数

        protected bool OnSyncStart(IpEndPoint iep,ref string msg)
        {
            this.Blocking = false; //设置非阻塞状态,以便事件通知的效率  
            bool ret = true;
            try
            {
                base.Connect(iep);
                ret = true;
            }
            catch (ArgumentNullException ae)
            {
                msg = ae.Message;
                ret = false;
            }
            catch (SocketException se)
            {
                if (se.NativeErrorCode == WSAEWOULDBLOCK)
                {
                    msg = "Connect Operation is pending";
                    this.socketState = SocketState.WaitingForConnect;
                    ret = true;
                }
                else
                {
                    msg = se.Message;
                    ret = false;
                }
            }
            catch (ObjectDisposedException)
            {
                msg = "this ClientSocket is Close";
                ret = false;
            }
            return ret;
        }

        protected override void OnStop()
        {
            string msg = null;
            try
            {
                if (this != null)
                {
                    if (this.Connected)
                    {
                        this.Shutdown(SocketShutdown.Both);
                        this.Disconnect(false);
                    }

                    this.Close();
                }

            }
            catch (ObjectDisposedException)
            {
                msg = "this Client socket is already close !";
                ErrorMsgManager(msg);
            }
        }

        protected override void OnLastOperCompeleted()
        {
            LastActiveTime = DateTime.Now;
        }

        #endregion

        #region 通用处理

        #region 通用处理接口函数

        public override void Stop()
        {
            OnStop();
        }

        public override bool SetSocketOption()
        {
            bool ret_value = true;
            try
            {
                this.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.KeepAlive, 1);
                //this.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);

                tcp_keepalive ka;
                ka.onoff = 1;
                ka.keepalivetime = 5000;
                ka.keepaliveinterval = 3000;
                byte[] IN = new byte[12];
                byte[] OUT = new byte[12];

                StructToBytes(ka, IN, typeof(tcp_keepalive));

                int ret_code = this.IOControl(IOControlCode.KeepAliveValues, IN, OUT);
                if (ret_code != 0)
                    ret_value = false;

            }
            catch (SocketException)
            {
                ret_value = false;
            }
            return ret_value;
        }

        public override bool SendCheck()
        {
            DateTime now;
            TimeSpan span;
            now = DateTime.Now;
            string msg = null;
            bool ret = false;

            if (socketState == SocketState.Disconnected)
            {
                span = now - ErrorStartTime;
                if (span.TotalMilliseconds >= this.ReconnectTime)
                {
                    ret = this.OnSyncStart(EndPoint,ref msg);
                    if (!ret)
                    {
                        ErrorMsgManager(msg);
                    }
                }
                else
                {
                }
            }
            else
            {
                if (socketState == SocketState.WaitingForConnect || socketState == SocketState.WritingData)
                {
                    ret = true;
                }
                else
                {
                    if (socketState != SocketState.Error)
                    {
                        span = now - LastActiveTime;
                        if (span.TotalMilliseconds >= this.HealthTime)
                        {
                            try
                            {
                                byte[] tmp = new byte[1];
                                Send(tmp, 0, 0);
                                OnLastOperCompeleted();
                            }
                            catch (SocketException e)
                            {
                                if (e.NativeErrorCode.Equals(10035))
                                {
                                }
                                else
                                {
                                    ErrorMsgManager(e.Message);
                                    OnSendError();
                                }
                            }
                        }
                        else
                        {
                        }
                    }
                    else
                    {
                    }
                }
                ret = true;
            }
            return ret;
        }

        public override bool ReadCheck()
        {
            bool ret = false;
            if (this.socketState != SocketState.Disconnected && this.socketState != SocketState.Error)
            {
                ret = true;
            }
            return ret;
        }

        public override bool ErrorCheck()
        {
            bool ret = false;

            if (socketState == SocketState.WaitingForConnect)
            {
                ret = true;
            }

            return ret;
        }

        protected virtual bool OnSendTelegram(byte[] buffer)
        {
            bool ret = false;
            string msg = null;
            if (isStr)
            {
                if (SendtelegramStr != null)
                {
                    msg = Encoding.ASCII.GetString(buffer);
                    ret = SendtelegramStr(msg);
                }
            }
            else
            {
                if (SendtelegramByte != null)
                {
                    ret = SendtelegramByte(buffer);
                }
            }
            
            return ret;
        }

        #endregion

        #region 内部通用处理函数

        private object BytesToStruct(byte[] bytes, Type strcutType)
        {

            int size = Marshal.SizeOf(strcutType);
            IntPtr buffer = Marshal.AllocHGlobal(size);
            try
            {
                Marshal.Copy(bytes, 0, buffer, size);
                object rVar = Marshal.PtrToStructure(buffer, strcutType);
                return rVar;
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }

        private void StructToBytes(tcp_keepalive ka, byte[] bytes, Type structType)
        {
            int size = Marshal.SizeOf(structType);
            IntPtr buffer = Marshal.AllocHGlobal(size);
            try
            {
                Marshal.StructureToPtr(ka, buffer, false);
                Marshal.Copy(buffer, bytes, 0, size);
            }
            catch (ArgumentException ae)
            {
                ErrorMsgManager(ae.Message);
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }

        #endregion

        #endregion

        #region 异常处理

        protected override void OnReceiveError(string msg)
        {
            ErrorMsgManager(msg);
            RaiseDisconnectedEvent();
        }

        protected override void OnSendError()
        {
            RaiseDisconnectedEvent();
        }

        protected override void RaiseErrorEvent(System.Exception x)
        {
            ErrorMsgManager(x.Message);
            OnSendError();
        }

        internal protected virtual void RaiseDisconnectedEvent()
        {
            EventHandler<SocketArgs> temp;
            temp = Errormanager;
            if (temp != null)
            {
                temp(this, new SocketArgs(Name));
            }
        }

        private void ErrorMsgManager(string msg)
        {
            if (this.SendErrormsg != null)
            {
                this.SendErrormsg(msg);
            }
        }

        #endregion
    }
}


实例下载地址

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警