나는 임의의 클라이언트 (socket.recv() 사용)로부터 tcp 메시지를 수신하는 작업의 일부인 C# 시스템을 유지 관리하고 있습니다. 우리는 메시지 프로토콜을 가지고 있기 때문에 외부 개발자들이 형식이 잘 짜여진 메시지를 채울 수 있습니다.어떻게 메시지를받을 수 있습니까?
메시지 형식은 다음과 같이
{ public data(fixed length):private data(variable length) }
메시지를 수신하려면, 우리는이 메시지에 개인 데이터 길이 필드가 필요하지만, 누군가가 잘못 길이 number.How를 입력 할 수 있습니다 메시지를 보낼 필요 이 수요를 충족시킬 수 있습니까? 적어도 안정적으로, 당신은 잘못된 형식의 메시지를 수용 할 수
public static int ReceiveMessage(int totalByteNumber, Socket socket, byte[] recvBuffer)
{
try
{
int offset = 0;
do
{
try
{
int num = socket.Receive(recvBuffer, offset, totalByteNumber - offset, SocketFlags.None);
if (num == 0)
{
throw new ApplicationException();
}
offset += num;
}
catch (SocketException ex)
{
if (ex.SocketErrorCode == SocketError.IOPending || ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
Thread.Sleep(30);
else if (ex.SocketErrorCode == SocketError.WouldBlock)
{
socket.Blocking = true;
Thread.Sleep(30);
}
else
{
LogManager.WriteError("Origin IP:" + (object) ((IPEndPoint) socket.RemoteEndPoint).Address);
throw ex;
}
}
}
while (offset < totalByteNumber);
return offset;
}
finally
{
SocketUtility.LogMessage("Recv", recvBuffer, socket);
}
}
단순히 전체 메시지 반환 오류를 읽을 수없는 경우. 메시지는 형식화되고 채워 져야합니다. – BWA
당신 말이 맞아요.하지만 그건 회사 정치에 관한 것입니다. 그래서 기술적으로 말하면, 거기에 대한 해결책이 있습니까? –
포트에서 주어진 바이트를 읽을 수 있습니다. 구문 분석 msg를 시도하고 너무 짧으면 더 읽은 후 prev 읽기와 병합하고 끝 메시지를 찾으십시오. – BWA