好傢伙即時得到這個錯誤,請參閱附件>>Index and count must refer to a location within the buffer. Parameter name: bytes
索引和計數必須引用緩衝區內的位置。參數名:字節
當使用調試器的IM我沒有得到這個錯誤,一切順利我不明白這是什麼錯誤是
這是我的服務器代碼:
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 27015);
Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
sck.Bind(ipEnd);
sck.Listen(100);
Socket clientSocket = sck.Accept();
string[] fNames = new string[3];
fNames[0] = "01.jpg";
fNames[1] = "02.jpg";
fNames[2] = "03.jpg";
string filePath = "D:\\";
byte[] FilesCount = BitConverter.GetBytes(fNames.Count());
clientSocket.Send(FilesCount);
for (int i = 0; i < fNames.Count(); i++)
{
byte[] fileNameByte = Encoding.ASCII.GetBytes(fNames[i]);
byte[] fileData = File.ReadAllBytes(filePath + fNames[i]);
byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
fileNameLen.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + fileNameByte.Length);
clientSocket.Send(clientData);
}
clientSocket.Close();
和客戶端:
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
clientSock.Connect(IPAddress.Parse("46.49.70.30"), 27015);
byte[] clientData = new byte[1024 * bt];
string receivedPath = "D:/df/";
byte[] FileQuantityByte = new byte[1024];
clientSock.Receive(FileQuantityByte);
int FileQuantity = BitConverter.ToInt32(FileQuantityByte, 0);
for (int i = 0; i < FileQuantity; i++)
{
int receivedBytesLen = clientSock.Receive(clientData);
int fileNameLen = BitConverter.ToInt32(clientData, 0);
string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
//Console.WriteLine("Client:{0} connected & File {1} started received.", clientSock.RemoteEndPoint, fileName);
BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName, FileMode.Append));
bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
//Console.WriteLine("File: {0} received & saved at path: {1}", fileName, receivedPath);
bWrite.Close();
}
clientSock.Close();
編輯:http://imageshack.us/f/202/errbk.jpg/
做線之前斷言,並驗證clientData長度爲至少4 + fileNameLen。如果它與調試器正常工作,我懷疑這是一個計時問題。 clientSock.Receive()是否返回調用時在緩衝區中可用的任何字節?或者在每次接收電話之前放置1秒的延遲,看看是否有幫助。 –