套接字发送最后收到的数据包

时间:2014-06-15 18:05:29

标签: c# sockets

我一直在为两个人聊天。一切都很棒(我有一些例外可以解决,但没什么大不了的。)

但问题是,当我从客户端向服务器发送消息,然后从服务器发送到客户端时,服务器发送它从客户端获得的最后一条消息,并且只有在您再次发送之后,它才会发送正确的消息而另一个消息四处走动。

客户端

private Socket _socket;
    private byte[] _buffer;
    private bool ok = false;
    private ListBox _listbox;

    public ClientSocket(ListBox list)
    {
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        _listbox = list;
    }

    public void Connect(string ipAddress, int port)
    {
        _socket.BeginConnect(new IPEndPoint(IPAddress.Parse(ipAddress), port), ConnectedCallback, null);
        if(ok)
            Item("Connected to the server!");
        else Item("Could not Connect to the server!");

    }

    public void SendMessage(string text)
    {
        _buffer = new byte[1024];
        _buffer = Encoding.Default.GetBytes(text);
        _socket.BeginSend(_buffer, 0, _buffer.Length, SocketFlags.None, SentCallback, null);
    }

    private void ConnectedCallback(IAsyncResult result)
    {
        if (_socket.Connected)
        {
            _socket.EndConnect(result);
            _buffer = new byte[1024];
            _socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceivedCallback, null);
            ok = true;
        }
    }

    private void ReceivedCallback(IAsyncResult result)
    {
        //_buffer = new byte[1024];
        int bufLength = _socket.EndReceive(result);
        //byte[] packet = new byte[bufLength];
        //Array.Copy(_buffer, packet, packet.Length);
        Array.Resize(ref _buffer, bufLength);
        Item(PacketHandler.Handle(_buffer, _socket));
        //PacketHandler.Handle(packet, _socket);

        _buffer = new byte[1024];
        _socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceivedCallback, null);
    }

    private void SentCallback(IAsyncResult result)
    {
        _socket.EndSend(result);
        //_buffer = new byte[1024];
    }

    public void Item(string text)
    {
        if (_listbox.InvokeRequired)
        {
            _listbox.Invoke(new Action<string>(Item), text);
            return;
        }
        _listbox.Items.Add(text);
    }

服务器

        private Socket _socket;
    private Socket _client;
    private byte[] _buffer = new byte[1024];
    private ListBox _listbox;
    public ServerSocket(ListBox list)
    {
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        _listbox = list;
    }

    public void Bind(int port)
    {
        _socket.Bind(new IPEndPoint(IPAddress.Any, port));
        Item("Server Started");
    }
    public void Listen(int backlog)
    {
        _socket.Listen(backlog);
        Item("Listening...");
    }
    public void Accept()
    {
        _socket.BeginAccept(AcceptedCallback, null);
    }
    public void SendMessage(string text)
    {
        _buffer = new byte[1024];
        _buffer = Encoding.Default.GetBytes(text);
        _client.BeginSend(_buffer, 0, _buffer.Length, SocketFlags.None, SentCallback, null);
    }

    private void AcceptedCallback(IAsyncResult result)
    {
        _client = _socket.EndAccept(result);
        _buffer = new byte[1024];
        _client.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceivedCallback, _client);
        //_listbox.Items.Add("Accepted User" + _socket.LocalEndPoint.AddressFamily.ToString() + " ");
        //Accept();
    }

    private void ReceivedCallback(IAsyncResult result)
    {
        try
        {
            //_client = result.AsyncState as Socket;
            int bufLength = _client.EndReceive(result);
            //byte[] packet = new byte[bufferSize];
            //Array.Copy(_buffer, packet, packet.Length);
            Array.Resize(ref _buffer, bufLength);
            Item(PacketHandler.Handle(_buffer, _client));
            //Item(PacketHandler.Handle(packet, clientSocket));
            //_listbox.Items.Add(PacketHandler.Handle(packet, clientSocket));
            _buffer = new byte[1024];
            _client.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceivedCallback, _client);
        }
        catch (SocketException)
        {
            Item(("User " + _client.LocalEndPoint.ToString() + " has disconnected"));
        }
    }

    private void SentCallback(IAsyncResult result)
    {
        _client.EndSend(result);
        //_buffer = new byte[1024];
    }
    public void Item(string text)
    {
        if (_listbox.InvokeRequired)
        {
            _listbox.Invoke(new Action<string>(Item), text);
            return;
        }
        _listbox.Items.Add(text);
    }

无法找到修复方法,我的代码是否正确? 顺便说一下,我不是母语人士,所以请耐心解决我的问题:D

1 个答案:

答案 0 :(得分:1)

_buffer成员变量用于所有发送/接收/接受操作。这可能会导致严重问题,请尝试为每个操作使用单独的成员缓冲区变量。