c# 2.0-C#用Socket异步时出现错误

问题描述

C#用Socket异步时出现错误

各位大侠:
我刚用 C# 写Socket 代码,服务器端用异步监控客户端,代码如下
//开启服务器端监控---Begin
internal void MonitorClient()
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 端口号);
Socket serverSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
serverSocket.Bind(ipep);
serverSocket.Listen(100);
serverSocket.BeginAccept(clientAcceptCallBack, serverSocket);
}
catch ( }
finally { } //serverSocket.Close(); serverSocket.Dispose();
}//End

    //异步监听客户端连接---Begin
    private void clientAcceptCallBack(IAsyncResult ar)
    {
        string IP     = "";
        try
        {
            Socket serverSocket = ar.AsyncState as Socket;
            Socket clientSocket = serverSocket.EndAccept(ar);     //结束异步Accept并获已连接的Socket
            IPEndPoint ipEndPoint = (IPEndPoint)clientSocket.RemoteEndPoint; //可能在这里或上面两行出错
            IP = ipEndPoint.Address.ToString() + ":" + ipEndPoint.Port.ToString();
            ThreadPool.QueueUserWorkItem(new WaitCallback(acceptClientMsg), (object)IP);   //收信息,并根据收到的信息执行相关操作
            serverSocket.BeginAccept(clientAcceptCallBack, serverSocket); //继续异步Accept,保持Accept一直开启!
        }
        catch (Exception ex) { }
        finally { }
    }//End

            在 clientAcceptCallBack 中偶尔会出现“远程主机关闭了一个现有连接”的错误,但出现次数少,没办法跟踪。

            由于出现次数少,没有规律,目前还不知道具体是什么原因,没办法跟踪和解决。

            有没有哪位高手知道是什么原因,或碰到过?

解决方案

acceptClientMsg 里是如何处理的?接收到消息后是否有返回信息?
如果有的话,应该是服务器端处理时间常,客户端ACCEPT超时,自动断开连接了。然后服务器端处理完毕后发送信息的时候就会出现已经关闭的错误。
不知道是不是这个问题,可以在ThreadPool.QueueUserWorkItem(new WaitCallback(acceptClientMsg), (object)IP); 之前加SLEEP,看看是否会固定出现关闭的错误。

解决方案二:

acceptClientMsg 专门负责处理消息,根据消息的类型执行各种操作,有些会返回信息给客户端,有些不会。我原来用 .exe 运行,当时发现:一般在客户端连接或断开的时候经常会出现这种情况。遗憾的是我用代码运行服务器后就没有出现这种情况。
谢谢 houwhf,我先按你说的改下程序。

时间: 2024-08-01 19:49:58

c# 2.0-C#用Socket异步时出现错误的相关文章

C# SOCKET异步,Wineows服务 ,服务

问题描述 用Windows服务写的一个Socket异步服务器,用来解析和处理客户端上传的数据,客户端有100多个吧,刚开始运行正常,几个小时后,服务还在运行,但不能解析客户端的数据了,而且客户端也连不上了,重新了一下服务,又好了,求高手解决,主要代码如下:privateManualResetEventallDone=newManualResetEvent(false);//启动服务方法publicvoidInitRfidServer(){try{//实例化套接字(ip4寻址协议,流式传输,TCP

c#(Socket)异步套接字代码示例_C#教程

异步客户端套接字示例   下面的示例程序创建一个连接到服务器的客户端.该客户端是用异步套接字生成的,因此在等待服务器返回响应时不挂起客户端应用程序的执行.该应用程序将字符串发送到服务器,然后在控制台显示该服务器返回的字符串. C# using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.Text; // State object for receiving dat

.net的socket异步通讯示例分享

 这篇文章主要介绍了.net的socket异步通讯示例,操作在下面,需要的朋友可以参考下 1.首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client   2.然后添加服务端代码,添加命名空间,界面上添加TextBox控件    代码如下: using System.Net; using System.Net.Sockets;     3.FormLoad方法添加代码    代码如下: private void Form1_Load(object sender,

TCP通信socket异步,客户端报异常:目标主机积极拒绝

问题描述 TCP通信socket异步,客户端报异常:目标主机积极拒绝 服务端只监听时,客户端建立1500个连接请求都可以正常建立连接,但当服务端改成建立连接后触发一个事件给客户端发送数据时,客户端异常:目标主机积极拒绝,只能建立部分连接.是何原因,希望有老师可以指点一下.不胜感激!! 解决方案 Socket(Tcp)通信客户端 解决方案二: 客户端接收的数据是否正确处理,然后就是看一下你服务器发送数据给客户端后,是不是关闭了连接

server-android采集图像并通过(Server端)socket发送时,只能发一次数据,为什么呢?

问题描述 android采集图像并通过(Server端)socket发送时,只能发一次数据,为什么呢? public class MainActivity extends ActionBarActivity { private EditText edOwnPort; private TextView tvOwnIP; SurfaceView sView; SurfaceHolder surfaceHolder; int screenWidth,screenHeight; Camera camer

udp socket-.Net UDP Socket 通讯时 如何实现客户端连续发信息或服务端连续发信息

问题描述 .Net UDP Socket 通讯时 如何实现客户端连续发信息或服务端连续发信息 本人是新手,写了 C# 的UDP SOcket 通讯程序,目前只实现了 客户端向服务端发送消息,服务端收到消息后回复消息,而 不能实现客户端连续向服务端发消息,服务端连续回复消息. 在查找资料说要使用多线程,但是我不懂,请求高手指导.代码如下: Client: private void btSendMsg_Click(object sender, EventArgs e) { byte[] data =

java-JAVA多线程Socket通信时遇到的问题???

问题描述 JAVA多线程Socket通信时遇到的问题??? 实验过程中,服务器和客户端都能连接上了,但是服务器就是收不到客户端发来的字符串. 再贴一下代码: //Mult.java package t14_chapter; import java.io.*; import java.net.*; class Mult extends Thread{ private Socket socket; private BufferedReader in; private PrintWriter out;

.net的socket异步通讯示例分享_实用技巧

1.首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2.然后添加服务端代码,添加命名空间,界面上添加TextBox控件 复制代码 代码如下: using System.Net;using System.Net.Sockets; 3.FormLoad方法添加代码 复制代码 代码如下: private void Form1_Load(object sender, EventArgs e)        {            IPEndPoint epS

剖析在WAS 6.1.0.19上碰到/snoop时执行不完整而出现ClassFormatError

剖析在WAS 6.1.0.19上碰到/snoop时执行不完整而出现ClassFormatError 关键字: WAS Linux 6.1.0.19 snoop ClassFormatError 环境RedHat Linux + WAS 6.1.0.19 部署默认的应用程序 DefaultApplication.ear,访问 /snoop时,出现页面显示不完整,只显示 Servlet Name: 并到 Request Information: 这两项的内容, 然后在页面的源码最下面有一行,虽然源码