TCP SOCKET:流在异步操作中发送/接收两次

本文关键字:两次 SOCKET 异步操作 TCP | 更新日期: 2023-09-27 18:08:01

我目前正在异步TCP程序工作,但我有以下问题:

  • -当服务器发送一些流时,客户端首先接收一个空缓冲区,然后接收流。
  • -在第一个流发送后,如果我正在发送另一个流,客户端的缓冲区包含第一个流发送和当前流。
  • -如果我正在发送另一个流,缓冲区将包含我之前发送的流和当前流…等等。

这真的很烦人,我不知道问题在哪里。下面是我的客户端代码:

Socket CLIENT;
byte[] _buffer;
private void button1_Click(object sender, EventArgs e)
{
    Start();
}
void Start()
{
    CLIENT = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    CLIENT.BeginConnect(IPAddress.Parse("the IPaddress"), 1234, new AsyncCallback(ConnectionCallBack), null);
}
private void ConnectionCallBack(IAsyncResult ar)
{
    try
    {
         CLIENT.EndConnect(ar);
         _buffer = new byte[CLIENT.ReceiveBufferSize];
         CLIENT.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null);
    }
    catch (Exception Er)
    {
        MessageBox.Show("[[[[ERROR:1]]]]=>" + Er.Message);
    }
}
private void ReceiveCallBack(IAsyncResult ar)
{
    try
    {
        int lenght = CLIENT.EndReceive(ar);
        if (lenght == 0)  { return; }
        Array.Resize(ref _buffer, lenght);
        string stream = ASCIIEncoding.ASCII.GetString(_buffer);
        Array.Resize(ref _buffer, CLIENT.ReceiveBufferSize);
        CLIENT.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null);
    }
    catch (Exception ex) { MessageBox.Show("[[[[hoERROR:2]]]]=>" + ex.Message); }
}

服务器:

private void button2_Click(object sender, EventArgs e)
        { 
            try
            {
                Socket socket = (Socket)listW.SelectedItems[0].Tag; //contains the socket
                socket.BeginSend(_buffer,0,_buffer.Length,SocketFlags.None,new AsyncCallback(SendingCallBack),socket);
                ServerSocket.BeginAccept(new AsyncCallback(AcceptCallBack),null);
            }
            catch (Exception er) { MessageBox.Show("[[[[ERROR:]]]]=>" + er.ToString()); }
        }
        private void SendingCallBack(IAsyncResult ar)
        {
            try
            {
                Socket socket = (Socket)ar.AsyncState;
                _buffer = ASCIIEncoding.ASCII.GetBytes(tx1.Text);
                socket.BeginSend(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(FinalCallBack),socket);
            }
            catch (Exception er) { MessageBox.Show("[[[[ERROR:3]]]]=>" + er.ToString()); }
        }
        private void Final(IAsyncResult ar)
        {
            Socket client = ar.AsyncState as Socket;
            client.EndSend(ar);
        }

TCP SOCKET:流在异步操作中发送/接收两次

我认为你有几个问题。一个是ReceiveCallback中的stream。你从缓冲区中得到一个字符串,然后对它不做任何事情。先调整缓冲区大小,然后再调整到原来的大小,这似乎是一种浪费。可能是很好地复制数据,然后调用GetString,你可以单独离开你的缓冲区。

在你的服务器中,你调用BeginSend来发送_buffer,当它完成时,你在SendingCallback中再次调用BeginSend,使用tx1.Text 的二进制表示,但你不调用EndSend ,当它完成时,你在第二个BeginSend上调用EndSend;但是第一个还没有调用