Ich führe ein C# -System, ein Teil dessen Job empfängt TCP-Nachrichten von zufälligen Clients (mit socket.recv()). Wir haben ein Nachrichtenprotokoll, damit Außenseiter-Entwickler gut formatierte Nachrichten füllen können.Wie kann ich eine Nachricht erhalten
Nachrichtenformat wie folgt:
{ public data(fixed length):private data(variable length) }
Nachricht empfangen zu können, benötigen wir ein privates Datenlängenfeld in dieser Nachricht, aber jemand braucht eine Nachricht zu senden, die in falsch Länge füllen können number.How Kann ich diese Nachfrage erfüllen?
Hier ist mein Code:
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);
}
}
Einfach, wenn Sie nicht den vollen Nachrichtenrücklauffehler lesen können. Die Nachricht muss gut formatiert und ausgefüllt sein. – BWA
Sie haben Recht, aber das ist die Unternehmenspolitik .... Ich frage mich also, technisch gibt es eine Lösung dafür? –
Sie können die angegebenen Bytes vom Port lesen, parsen Sie msg und wenn zu kurz, lesen Sie mehr, fusionieren Sie mit prev read, und versuchen Sie, die Endnachricht zu finden. – BWA