невозможно получить весь пакет с сервера, использовать TCP-сокет BeginReceive - PullRequest
0 голосов
/ 12 апреля 2019

Нам необходимо отправить запрос на сервер, чтобы получить некоторые данные, и мы используем сокет для асинхронного выполнения этого.

try
            {
                aTimerProcess.Start();
                //Create socket with options: IPv4 address, a stream socket, TCP/IP Protocol
                if (_socket == null)
                    _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                //Connect to Malvern
                if (!boolTimeOutProcess)
                {
                    connectDone.Reset();
                    IAsyncResult result = _socket.BeginConnect(_endPoint, new AsyncCallback(ConnectCallback), _socket);
                    connectDone.WaitOne();

                    if (_socket.Connected == false)
                        boolTimeOutProcess = true;

                    if (!boolTimeOutProcess)
                        boolSocketConnect = true;
                }

                //Send data
                if (!boolTimeOutProcess)
                {
                    sendDone.Reset();
                    vSyncTrace.LevelOneMessage("Malvern API - Sent: " + _requestString);



                    _socket.BeginSend(_requestBuffer, 0, _requestBuffer.Length, 0, new AsyncCallback(SendCallback), _socket);
                    sendDone.WaitOne();
                }

                //Wait for data to be returned
                if (!boolTimeOutProcess)
                {
                    receiveDone.Reset();
                    StateObject state = new StateObject();
                    state.workSocket = _socket;
                    _socket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
                    receiveDone.WaitOne();


                    if (receiveCallBackException != null)
                        throw new MalvernException("Malvern Callback Exception. Details:" 
                                                   + receiveCallBackException.Message,
                                                   receiveCallBackException);

                    _replyString = state.sb.ToString();
                    vSyncTrace.LevelOneMessage("Malvern API - Received: " + _replyString);
                    aTimerProcess.Stop();
                }

Тогда метод BeginReceive будет

private static void ReceiveCallback(IAsyncResult ar)
        {
            vSyncTrace.RunLogging();
            StateObject state = null;

            try
            {                
                state = (StateObject) ar.AsyncState;
                Socket _socket = state.workSocket;

                int bytesRead = _socket.EndReceive(ar);
                if (bytesRead > 0)
                {
                    state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
                    vSyncTrace.LevelOneMessage("Print Buffer Tracking: " + state.sb.ToString());

                    _socket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);

                }
            }

            catch (ObjectDisposedException ex)
            {
                state.workSocket = null;
                // clean up of warning messages...
                Console.WriteLine(ex.Message);
                //
            }
            catch (Exception e)
            {

                receiveCallBackException = e;
                receiveDone.Set();
            }
        }

Мы неНе знаю, как сервер отправляет данные.Но он отвечает в 2 пакетах или 3 пакетах в зависимости от длины данных.Когда дело доходит до 2 пакета вместе.ReceiveCallback будет введен дважды и объединит 2 строки вместе.Но когда у него будет 3 пакета, он отправит запрос, чтобы спросить остальную часть пакета.И ReceiveCallback не будет введен до тех пор, пока сокет не будет закрыт. Но закрытый сокет не сможет сделать beginReceive.Я просто хочу знать, как я должен обрабатывать ответы нескольких пакетов и объединять их вместе.Заранее спасибо.

...