AcceptCallback()里面应该加上connectDone.set()

解决方案 »

  1.   

    1.客户端关闭socket之后,服务端自动监测到吗?
    是不是客户端发送完数据后就关闭socket,还是等到服务端接收完数据后发送一个消息告诉
    客户端已经接收到所有数据,然后客户端接收到这个消息后就关闭socket
    2.connectDone,receiveDone,sendDone的含义是什么 ,什么时候用,我不明白
    请赐教一二
      

  2.   

    监听程序;
    int nPort = Convert.ToInt32(port_textbox.Text);
    IPEndPoint ipLocalEndPoint;IPAddress ipAddress = Dns.GetHostByName (Dns.GetHostName ()).AddressList [0];
    ipLocalEndPoint = new IPEndPoint(ipAddress, nPort);
    ListenSoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp );
    ListenSoc.Bind(ipLocalEndPoint);
    ListenSoc.Listen(5);
    ListenSoc.BeginAccept(new AsyncCallback(AcceptCallback),ListenSoc);
    //回掉函数
    public static void AcceptCallback(IAsyncResult ar)
    {
    Socket listener=(Socket)ar.AsyncState;
    Socket handler=listener.EndAccept(ar);listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);StateObject state=new StateObject();
    state.workSocket=handler;
    handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReceiveCallback),state
    }
      

  3.   

    小火柴:你的监听部分不用
    while(true)
    {
    connectDone.Reset();
    ListenSoc.BeginAccept(new AsyncCallback(AcceptCallback),ListenSoc);
    connectDone.WaitOne();
    }吗?
    和直接用ListenSoc.BeginAccept(new AsyncCallback(AcceptCallback),ListenSoc);有什么不一样?
    而且我的两个问题你好象没回答我呀
      

  4.   

    你再看看给public static void AcceptCallback(IAsyncResult ar)里多了什么
      

  5.   

    这是前几天帮个朋友写的,你看看
    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Collections;namespace Server
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class SocketServer
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    //
    // TODO: 在此处添加代码以启动应用程序
    //
    SocketServer socketServer = new SocketServer();
    socketServer.Listen(); System.Threading.Thread.CurrentThread.Suspend();
    } SortedList clientList;
    public SocketServer()
    {
    clientList = new SortedList();
    } Socket serverSocket;
    /// <summary>
    /// 启动监听
    /// </summary>
    public void Listen()
    {
    serverSocket = new Socket(AddressFamily.InterNetwork  ,SocketType.Stream,ProtocolType.Tcp);
    IPHostEntry lipa = Dns.Resolve(Dns.GetHostName());
    IPEndPoint lep = new IPEndPoint(lipa.AddressList[0],8788);
    serverSocket.Bind(lep);
    serverSocket.Listen(100); //最大等待连接数
    serverSocket.BeginAccept(new AsyncCallback(Accept_Callback),serverSocket); Console.WriteLine("Listen ...");
    } void Accept_Callback(IAsyncResult e)
    {
    //接受连接
    Socket clientSocket = this.serverSocket.EndAccept(e); string ip = SocketIP(clientSocket);
    clientList.Add(clientList.Count, clientSocket); Console.WriteLine("Accept " + ip ); //继续监听
    serverSocket.BeginAccept(new AsyncCallback(Accept_Callback),null); //异步开始接收数据
    StateObject stateObject = new StateObject(clientSocket);
    clientSocket.BeginReceive(stateObject.Buffer,0,stateObject.Buffer.Length,
    SocketFlags.None,new AsyncCallback(CalReceive_Callback),stateObject);
    } void CalReceive_Callback(System.IAsyncResult r)
    {
    StateObject stateObject = (StateObject)r.AsyncState;
    Socket clientSocket = stateObject.SocketObject;
    string ip = this.SocketIP(clientSocket);
    int len=clientSocket.EndReceive(r);

    if(len==0)
    {
    if(clientList.ContainsKey(ip))
    clientList.Remove(ip);
    return;
    } string msg = System.Text.Encoding.Default.GetString(stateObject.Buffer,0,len);
    Console.WriteLine("Receive Message From " + ip + "\n" + msg + "\n----------------------------"); //异步开始接收数据
    stateObject = new StateObject(clientSocket);
    clientSocket.BeginReceive(stateObject.Buffer,0,stateObject.Buffer.Length,
    SocketFlags.None,new AsyncCallback(CalReceive_Callback),stateObject);
    } /// <summary>
    /// 取IP地址
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    string SocketIP(Socket s)
    {
    string r;
    r=((IPEndPoint)s.RemoteEndPoint).Address.ToString();
    return r;
    }
    } class StateObject
    {
    public byte[] Buffer;
    public Socket SocketObject;
    public StateObject(Socket s)
    {
    this.SocketObject=s;
    this.Buffer=new byte[200];
    }
    }
    }
      

  6.   

    其实我觉得:你Accept_Callback里的 serverSocket.BeginAccept(new AsyncCallback(Accept_Callback),null);可以被connectDone.set()代替。
    1。
    有个问题:我在客户端传完文件后关闭掉客户端socket,用shutdown.receive关的,可是总是出现“不能访问名为System.net.sockets.socket的已处置对象",如果没有客户端的socket关闭就不出现,我在想是不是,客户端关掉后,服务端发现了客户端关掉了socket,可是客户端传来的数据还没接收完所以出现这种提示,其实,最后文件也传完了,我在想时不是我程序的问题。