سؤال

أحاول التفاعل مع تطبيق عبر الشبكة التي تستخدم بروتوكول بسيط. يجب أن أرسل رأسا يشبه هذا:

2 بايت = طول البيانات (بما في ذلك نوع الطلب)
1 بايت = نوع الطلب

أنا آخذ كل من المعلمات كعضاء:

private static void WriteHeader(Stream buf, int length, int requestType) {
    buf.Write(BitConverter.GetBytes(length), 0, 2);
    buf.WriteByte((byte)requestType);
}

أنا أسميها مثل هذا:

byte[] outBuf = new byte[256];
using (MemoryStream outStream = new MemoryStream(outBuf)) {
    // Socket connection stuff here
    WriteHeader(outStream, 1, 110);
    sock.Send(outBuf);
    // Receive stuff here, never returns
}

لا أحصل على أي نوع من الاستثناء عند الاتصال بهذه الطريقة أو إرسالها outBuf على مقبس، ولكن تطبيق الشبكة لا يستجيب أبدا. يمكنني الاستعلام عن البرامج الأخرى، لذلك، لذلك أنا شبه متأكد من أنه لأن رأسي لا يكتب بشكل صحيح.

هل أفعل شيئا خاطئا عند كتابة القيم؟

تعديل: وأضاف رمز الذاكرة

هل كانت مفيدة؟

المحلول

ما نوع الدفق هو؟ إذا كان التخفيف من المدخلات الخاصة بك، فقد لا يتم بالفعل إرسال البيانات عبر السلك.

تعديل:

bitconverter.getbytes (1) يمنحك [1، 0، 0، 0]، منها تمر [1،0]. ربما قضية نيس نيس. حاول إرسال [0،1] كما رأسك.

نصائح أخرى

هل يمكن أن تكون هناك مشكلات نيس نيس بين عميلك والخادم؟ يمكنك محاولة التقاط حركة مرور الشبكة Wireshark. أو أداة مماثلة، ثم قارن الحزم المرسلة / المستلمة باستخدام عميلك مقابل بعض التطبيقات الأخرى التي تنقل بنجاح.

جرب المجال

void WriteHeader(Stream s, int len, int cmd) {
    var buf = new byte[3];
    s.Write(BitConverter.GetBytes((UInt16)len));
    s.WriteByte((byte)cmd);
}

var ns = new NetworkStream(sock);
WriteHeader(ns, 1, 110);

أستطيع أن أفكر في ثلاثة مصادر أخطاء في هذا الرمز:

  • مشاكل الانسيان: ما هو أمر البايت لمدة 2 بايت طول ترسله، وهل أنت متأكد من أن getbytes يعطي البايتات بالترتيب الصحيح؟
  • حجم الحزمة: أنت ترسل 256 بايت من البيانات، على الرغم من أن رسالتك هي فقط 3 بايت في الحجم.
  • الحمولة: لا تضع أي حمولة في الرسالة، ولكن الرسالة 110 قد تتطلب بيانات إضافية.

أظن أنك بحاجة إلى جعل طولك قصير. عندما تقوم Wrtie بالدوار، أظن أنك ستحصل فقط على اثنين من البايتين منذ INT هي 4 بايت وأنت تكتب اثنين فقط منهم إلى BUF.

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