询问者
异步TCP的服务端,开启一段时间后异常

问题
-
主要用于
连接设备 接受数据入库和缓存
现在情况是
刚开启没问题
服务端,软件模拟连接OK
客户端,软件模拟OK
设备,接入正常
可一段时间后,大致情况是:
1.内外网可以连接到开启的端口
2.软件模拟可以发送,但接受不到数据
(一般 3个多小时 可以连接端口 但数据没上来 主要在外网端体现 内网测试还是正常)
(是不是 我服务器IIS等的设置没配好Windows server 2012 IIS8)
麻烦有人看下
下面是代码:private static Socket listener = null; /// <summary> /// 开始监听 /// </summary> /// <param name="port">端口号</param> public void StartListening(int port) { // 建立服务器Socket // 获取本机DNS // 开始监听 // IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); IPAddress ipAddress = IPAddress.Any;//.Parse("192.168.1.104"); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port); // 创建 TCP/IP Socket. listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Socket绑定到本地终结点,然后侦听传入的连接。 try { listener.Bind(localEndPoint); listener.Listen(100); while (true) { // 设置无信号状态的事件 allDone.Reset(); //线程池 ThreadPool.QueueUserWorkItem(o => { ThreadAsync(); }); //开启线程 //Thread thread = new Thread(ThreadAsync); //thread.Start(); // 在继续之前,等待连接 allDone.WaitOne(); } } catch (SocketException e) { FileConfig.WritetFile(Constants.AsyncSocketException, e.Message, e.ErrorCode); } } /// <summary> /// 线程异步 /// </summary> private void ThreadAsync() { // 开始异步Socket侦听连接。 listener.BeginAccept( new AsyncCallback(AcceptCallback), listener); } /// <summary> /// 异步回调 /// </summary> /// <param name="ar"></param> public static void AcceptCallback(IAsyncResult ar) { // 信号 主线继续。 allDone.Set(); // 获取Socket处理客户端请求。 // Socket listener = (Socket)ar.AsyncState; Socket handler = listener.EndAccept(ar); // 加入列表 MyHashTable.socketList MyHashTable.AddListItem(MyHashTable.socketList, handler.RemoteEndPoint.ToString(), handler); // 赋值线程名字 Thread.CurrentThread.Name = handler.RemoteEndPoint.ToString(); while (true) { // 休眠一秒 避免循环占用过多CPU Thread.Sleep(1000); if (handler.Available > 0) { // 创建状态对象。 StateObject state = new StateObject(); state.workSocket = handler; handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); } } } /// <summary> /// 读取 /// </summary> /// <param name="ar"></param> public static void ReadCallback(IAsyncResult ar) { String content = String.Empty; // 索和处理程序套接字的状态对象 // 异步状态对象。 StateObject state = (StateObject)ar.AsyncState; Socket handler = state.workSocket; // 从客户端套接字读取数据。 int bytesRead = handler.EndReceive(ar); string strSql = string.Empty; string warningCode = string.Empty; if (bytesRead > 0) { content = Encoding.ASCII.GetString(state.buffer, 0, bytesRead).ToLower(); //一系列判断 入库操作 有问题的话 我也可以把这块 贴出来 ... } //置空 IAsyncResult 对象 ar = null; }
页面代码开启监听
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //异步Socket监听 AsyncSocket asyncSocket = new AsyncSocket(); asyncSocket.StartListening(2020); } }
全部回复
-
Hi,
欢迎来到MSDN中文论坛。
你是不是组策略有设置了IPSec或者一些端口显示,或者你的客户端存在防火墙的端口限制,如果那样的话你先用telnet去连接下服务器端,以及通过服务端链接客户端看下数据能够到达,可以使用IP Tools工具去模拟下发送数据和接受数据,具体的下载地址如下:http://down.tech.sina.com.cn/content/15352.html
Jason Wang [MSFT]
MSDN Community Support | Feedback to us