我想通過套接字發送大量數據,有時當我調用發送(在Windows上)時,它不會發送我所請求的所有數據,如預期的那樣。所以,我寫了一個應該解決了我的問題的小函數 - 但是它導致數據未被正確發送並導致圖像被破壞的問題。我正在創建一個簡單的聊天室,您可以將圖像(截圖)發送給對方。如何通過套接字發送所有數據?
爲什麼我的功能不工作?
我該如何讓它工作?
void _internal_SendFile_alignment_512(SOCKET sock, BYTE *data, DWORD datasize)
{
Sock::Packet packet;
packet.DataSize = datasize;
packet.PacketType = PACKET_FILETRANSFER_INITIATE;
DWORD until = datasize/512;
send(sock, (const char*)&packet, sizeof(packet), 0);
unsigned int pos = 0;
while(pos != datasize)
{
pos += send(sock, (char *)(data + pos), datasize - pos, 0);
}
}
我的接收端是:
public override void OnReceiveData(TcpLib.ConnectionState state)
{
if (state.fileTransfer == true && state.waitingFor > 0)
{
byte[] buffer = new byte[state.AvailableData];
int readBytes = state.Read(buffer, 0, state.AvailableData);
state.waitingFor -= readBytes;
state.bw.Write(buffer);
state.bw.Flush();
if (state.waitingFor == 0)
{
state.bw.Close();
state.hFile.Close();
state.fileTransfer = false;
IPEndPoint ip = state.RemoteEndPoint as IPEndPoint;
Program.MainForm.log("Ended file transfer with " + ip);
}
}
else if(state.AvailableData > 7)
{
byte[] buffer = new byte[8];
int readBytes = state.Read(buffer, 0, 8);
if (readBytes == 8)
{
Packet packet = ByteArrayToStructure<Packet>(buffer);
if (packet.PacketType == PACKET_FILETRANSFER_INITIATE)
{
IPEndPoint ip = state.RemoteEndPoint as IPEndPoint;
String filename = getUniqueFileName("" + ip.Address);
if (filename == null)
{
Program.MainForm.log("Error getting filename for " + ip);
state.EndConnection();
return;
}
byte[] data = new byte[state.AvailableData];
readBytes = state.Read(data, 0, state.AvailableData);
state.waitingFor = packet.DataSize - readBytes;
state.hFile = new FileStream(filename, FileMode.Append);
state.bw = new BinaryWriter(state.hFile);
state.bw.Write(data);
state.bw.Flush();
state.fileTransfer = true;
Program.MainForm.log("Initiated file transfer with " + ip);
}
}
}
}
它接收的所有數據,當我調試我的代碼,看到send()
不返回的總數據量(即它被稱爲多一次),圖像中出現黃線或紫線 - 我懷疑發送數據有問題。
的[發送圖像在C++套接字(Linux)的(HTTP可能重複解決的事情:/ /stackoverflow.com/q/3125080/427192),儘管這不是Linux – 2013-04-25 19:14:32