문제

간단한 프로토콜을 사용하는 네트워크를 통해 애플리케이션과 상호 작용하려고 합니다.다음과 같은 헤더를 보내야 합니다.

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 소켓을 통해 연결했지만 네트워크 응용 프로그램이 응답하지 않습니다.하지만 다른 프로그램으로 쿼리할 수 있으므로 헤더가 올바르게 작성되지 않았기 때문이라고 확신합니다.

값을 작성할 때 제가 뭔가 잘못하고 있는 걸까요?

편집하다: MemoryStream 코드 추가

도움이 되었습니까?

해결책

어떤 종류의 스트림인가요?입력을 버퍼링하는 경우 데이터는 실제로 전선을 통해 전송되지 않을 수 있습니다.

편집하다:

BitConverter.GetBytes(1)은 [1,0]을 전달하는 [1, 0, 0, 0]을 제공합니다.어쩌면 엔디안 문제일 수도 있습니다.헤더로 [0,1]을 보내보세요.

다른 팁

클라이언트와 서버 사이에 엔디안 문제가 있을 수 있습니까?네트워크 트래픽을 캡처 할 수 있습니다 와이어샤크 또는 유사한 도구를 사용하여 클라이언트를 사용하여 보내고 받은 패킷과 성공적으로 통신하는 다른 응용 프로그램을 비교하십시오.

NetworkStream을 사용해 보세요:

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가 올바른 순서로 바이트를 제공한다고 확신합니까?
  • 패킷 크기:메시지 크기가 3바이트에 불과하더라도 256바이트의 데이터를 보내고 있습니다.
  • 유효 탑재량:메시지에 페이로드를 넣지 않지만 메시지 110에는 추가 데이터가 필요할 수 있습니다.

길이를 짧게 하셔야 할 것 같아요.스트림에 int를 쓸 때 int가 4바이트이고 그 중 2바이트만 buf에 쓰기 때문에 상위 2바이트만 얻을 것이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top