首次运行后,异步客户端服务器System.Net.Sockets.SocketException

时间:2019-02-13 01:01:52

标签: c# asynchronous client-server

我有一个异步客户端服务器,在该服务器中来回发送数据。该序列成功完成,并在第一次时适当关闭套接字连接。单击按钮,应发生相同的顺序。但是,当客户端在第一次运行后尝试将数据发送到服务器时,有时会发生SocketException。

我在建立连接时是否做错了什么,是否与时间有关,还是我遗漏了其他东西会导致错误?

我添加了_baseSocket.Poll()来解决此问题。它的确提高了性能,但是最终还是由于重复该过程最终导致崩溃错误,主要是因为我单击按钮的速度太快才能重新启动过程。如果我有断点,它每次都可以工作。我尝试添加一些时间延迟,但这也没有解决此问题。

主要WPF表单

private void connectCallback(object sender, string error)
{
    if(!Dispatcher.CheckAccess())
    {
        Dispatcher.Invoke(new ConnectCallback(connectCallback), sender, 
            error);
        return;
    }
}  

OtherClass

public void Connect(string hostName, int port, ConnectCallback callback)
{
    _connectCallback = callback;
    _baseSocket.BeginConnect(hostName, port, connectCallback, null);
}

private void connectCallback(IAsyncResult ar)
{
    string error = null;
    try
    {
        _baseSocket.EndConnect(ar);
        EndPoint = (IPEndPoint)_baseSocket.RemoteEndPoint;
    }
    catch(Exception ex)
    {
        error = ex.Message;
    }

    _connectCallback(this, error);
}


public void Send(string data, int bufferSize)
{
    byte[] bData = Encoding.ASCII.GetBytes(data);
    byte[] sendBuffer = new byte[bufferSize];
    bData.CopyTo(sendBuffer, 0);


    _baseSocket.Poll(10, SelectMode.SelectWrite);
    _baseSocket.sendBuffer, 0, sendBuffer.Length, SocketFlags.None, new 
        AsyncCallback(SendCallback), _baseSocket);
}

0 个答案:

没有答案