سؤال

أحاول قراءة استجابة نص ASCII من مقبس تدفق مفتوح لـ TCP

هذا ما توصلت إليه حتى الآن.أريد أن أعرف ما هي أفضل طريقة للقيام بذلك والتي تتضمن معالجة الأخطاء.هل يجب عليّ أيضًا التحقق من خطأ المقبس بعد تلقي المكالمة في حلقة العمل؟

IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.1.1"), 9000);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.SendTimeout = 5000;
sock.ReceiveTimeout = 5000;
if (null != sock)
{
    try
    {
        sock.Connect(ep);
        if (sock.Connected)
        {

            // Blocks until send returns.
            int bytesSent = sock.Send(buffer);
            Console.WriteLine("Sent {0} bytes.", bytesSent);
            //get the first 4 bytes, should be the lenngth of the rest of the response.
            byte[] response = new byte[4];
            int bytesRec = sock.Receive(response);
            int totalBytesRec = 0;
            if (4 == bytesRec)
            {
                int len = BitConverter.ToInt32(response, 0);
                response = new byte[len];
                Console.WriteLine("Trying to get {0} bytes.", len);
                bytesRec = 0;

                do
                {
                    bytesRec = sock.Receive(response);
                    totalBytesRec += bytesRec;
                    forecast += Encoding.ASCII.GetString(response, 0, bytesRec);
                } while (totalBytesRec < len && bytesRec > 0);

                if (totalBytesRec != len)
                    throw new Exception("The total bytes recieved from manager did not equal the expected bytes");
            }
            else
                throw new Exception("Unable to get the response size from the manager");


            Console.WriteLine("Received {0} bytes.", totalBytesRec);
        }

    }
    catch (SocketException ex)
    {
        Console.WriteLine("{0} Error code: {1}.", ex.Message, ex.ErrorCode);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    finally
    {
        sock.Shutdown(SocketShutdown.Both);
        sock.Close();
    }
}
هل كانت مفيدة؟

المحلول

أفضل رهان لك هو على الأرجح TcpClient.هناك نموذج رائع يقوم بالضبط بما تفعله بشكل صحيح في وثائق .NET هنا:

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx

كل التوفيق لك!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top