c# 创建socket连接辅助类

using AD.SocketForm.Model;
using NLog;
using System;
using System.Net;
using System.Net.Sockets;

namespace AD.SocketForm.Service
{
    public class SocketService
    {
        private Logger _logger = LogManager.GetCurrentClassLogger();

        /// <summary>
        /// 创建socket
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public Socket Create(HubModel model)
        {
            try
            {
                // 将IP地址字符串转换为IPAddress对象
                IPAddress ip = IPAddress.Parse(model.IP);
                // 创建终结点EndPoint
                IPEndPoint endPoint = new IPEndPoint(ip, model.Port);
                // 创建Socket并连接到服务器
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                // 连接到服务器
                socket.Connect(endPoint);

                return socket;
            }
            catch (System.Exception ex)
            {
                _logger.Error(string.Format("获取socket异常,message:{0},stacktrace:{1}", ex.Message, ex.StackTrace));
            }
            return null;
        }

        /// <summary>
        /// 关闭socket
        /// </summary>
        /// <param name="socket"></param>
        public void Close(Socket socket)
        {
            if (socket != null)
            {
                socket.Close();
                socket = null;
            }
        }

        /// <summary>
        /// 判断Socket是否已连接
        /// </summary>
        /// <param name="socket"></param>
        /// <returns></returns>
        public bool IsConnected(Socket socket)
        {
            if (socket == null || socket.Connected == false)
            {
                return false;
            }

            bool blockingState = socket.Blocking;
            try
            {
                byte[] tmp = new byte[1];
                socket.Blocking = false;
                socket.Send(tmp, 0, 0);
                return true;
            }
            catch (SocketException e)
            {
                // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的
                if (e.NativeErrorCode.Equals(10035))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                _logger.Error(string.Format("检查Socket是否可连接时异常,message:{0},stacktrace:{1}", ex.Message, ex.StackTrace));
                return false;
            }
            finally
            {
                socket.Blocking = blockingState;    // 恢复状态
            }
        }
    }
}

 

posted @ 2019-11-08 19:47  屌丝大叔的笔记  阅读(1239)  评论(0编辑  收藏  举报