2015-02-11 64 views
2

所以我試圖做一個聊天室。我使用TCP套接字發送所有信息。但是當我發送一個字節數組時,接收套接字緩衝區的最後一個字節缺失。它是0,因爲字節數組是255大的,所以剩下的字節是0.我已經通過調試模式檢查過,在發送數據包的時候,數組是正確的。但是,在插座完成接收時,它丟失了最後一個字節的中斷點。爲什麼會發生這種情況?我看到另一個線程說你必須停止線程直到套接字完成接收,但是我使用的是AsyncCallBack,據我所知,套接字已經完成接收。通過TCP套接字鬆動一個字節

此外,每個數據包中的第一個字節應該是字符串大小(以說明多餘的空字節)。

PacketClass:

public class Packet 
{ 
    public byte[] Buffer; 

    public Packet(string message) 
    { 
     Buffer = new byte[255]; 

     byte[] messageArray = Encoding.ASCII.GetBytes(message); 

     Buffer[0] = (byte)messageArray.GetLength(0); 

     for (int i = 0; i < messageArray.GetLength(0); i++) 
     { 
      Buffer[i+1] = messageArray[i]; 
     } 

    } 
    public Packet(byte[] buffer) 
    { 
     Buffer = buffer; 
    } 
    public string GetMessage() 
    { 
     List<byte> messageBuffer = new List<byte>(); 

     for (int i = 1; i <= Buffer[0]; i++) 
     { 
      messageBuffer.Add(Buffer[i]); 
     } 

     return Encoding.ASCII.GetString(messageBuffer.ToArray()); 
    } 

} 

SocketClass:

class Client 
{ 
    public static List<Client> connectedClients = new List<Client>(); 
    public Socket Sock; 
    public byte[] Buffer = new byte[255]; 

    public Client(Socket pSock) 
    { 
     Sock = pSock; 
     Sock.BeginReceive(Buffer, 0, 255, SocketFlags.None, new AsyncCallback(RecieveCallBack), null); 
    } 

    public void Send(byte[] pBuffer) 
    { 
     Sock.BeginSend(pBuffer, 0, pBuffer.GetLength(0), SocketFlags.None, new AsyncCallback(SendCallBack), null); 
    } 

    public void SendCallBack(IAsyncResult AR) 
    { 
     Console.WriteLine("Sent"); 
     Sock.EndSend(AR); 
    } 
    public void RecieveCallBack(IAsyncResult AR) 
    { 
     Sock.EndReceive(AR); 

     Packet recPacket = new Packet(Buffer); 
     Console.WriteLine(recPacket.GetMessage()); 

     Sock.BeginReceive(Buffer, 0, 255, SocketFlags.None, new AsyncCallback(RecieveCallBack), null); 
    } 
} 

主要服務器程序 `類客戶端 { 公共靜態列表connectedClients =新名單(); public Socket Sock; public byte [] Buffer = new byte [255];

public Client(Socket pSock) 
    { 
     Sock = pSock; 
     Sock.BeginReceive(Buffer, 0, 255, SocketFlags.None, new AsyncCallback(RecieveCallBack), null); 
    } 

    public void Send(byte[] pBuffer) 
    { 
     Sock.BeginSend(pBuffer, 0, pBuffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), null); 
    } 

    public void SendCallBack(IAsyncResult AR) 
    { 
     Console.WriteLine("Sent"); 
     Sock.EndSend(AR); 
    } 
    public void RecieveCallBack(IAsyncResult AR) 
    { 
     Sock.EndReceive(AR); 

     Packet recPacket = new Packet(Buffer); 
     Console.WriteLine(recPacket.GetMessage()); 

     Sock.BeginReceive(Buffer, 0, 255, SocketFlags.None, new AsyncCallback(RecieveCallBack), null); 
    } 
}` 
+0

我假設您知道,如果傳入的消息大於254個字符,它會因陣列不夠大而崩潰? – 2015-02-11 00:47:12

+0

我打算將字符串限制爲固定大小。 – Spader 2015-02-11 00:55:17

+0

你使用什麼協議? TCP?你能告訴你如何實例化'Sock'變量嗎? – 2015-02-11 01:25:39

回答

0

解決

錯誤是在我不包括髮送方法。

sock.BeginSend(sentBuffer[0].Buffer, 0, sentBuffer[0].Buffer[0], SocketFlags.None, new AsyncCallback(SendCallBack), null); 

sentBuffer是一個列表,成爲一個隊列。我將其更改爲255並且它工作