我正在維護一個C#系統,其部分工作是從隨機客戶端接收tcp消息(使用socket.recv())。我們有一個消息協議,這樣外人開發人員可以填寫格式良好的消息。我如何收到消息
郵件格式如下:
{ 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
你是對的,但那是關於公司政治......所以我只是想知道,從技術上講,是否有解決方案? –
你可以從端口讀取給定的字節,嘗試解析信息,如果太短,讀取更多,與prev讀取合併,並嘗試找到結束消息。 – BWA