我有2臺電腦:我會稱它們爲Comp A,Comp B;服務器沒有收到所有消息
我不得不:
- 發送從小樣А到份B PCM格式的一個聲音文件;
- 驗證此文件傳輸的準確程度;
- 玩什麼我發送給B組份的比較B.
要發送的文件,我使用的功能
socket.SendTo(packet,0,count,SocketFlags.None,remoteEP);
從System.Net.Sockets
。
因此我得出結論,該文件正在被精確傳輸。我使用Wireshark在Comp A和Comp B上監視它。然而,到達Comp B的字節數據包與傳輸的文件並不完全一致。
發送文件數據的程序,以正確的方式打開這個文件。然後它將源PCM文件的右字節傳遞給函數Socket.SendTo(...)
。但Comp A(輸出)的Wireshark顯示絕對不正確的字節,即Comp A發送不正確的字節。
可能是什麼問題?
我想通了,功能socket.SendTo(packet,0,count,SocketFlags.None,remoteEP);
發送正確的字節,如果我有一個延遲發送。我的意思是我可以發送400字節(沒有循環),我的程序發送400絕對精確,正確的字節。
但我有一個很大的PCM文件。它的大小約爲50 Mb。它的持續時間是1分鐘。我必須在一分鐘內發送這個文件,以便這個文件能夠均勻一致地傳輸。這意味着每秒需要傳輸大約800 Kb的數據。
所以這裏是我的程序代碼。我使用每秒鐘2次的定時器函數每秒發送每800 Kb。
private void m_pTimer_Tick(object sender,EventArgs e)
{
uint sent_data = 0;
while ((sent_data <= (BUFFERSIZE/120)) && ((num * RAW_PACKET) + sent_data < BUFFERSIZE))
{
uint bytes_count = ((BUFFERSIZE - (RAW_PACKET * num)) > RAW_PACKET) ? RAW_PACKET : (BUFFERSIZE - (RAW_PACKET * num));
byte[] buffer = new byte[bytes_count];
Array.Copy(ReadBuffer, num * RAW_PACKET, buffer, 0, bytes_count);
num++;
// Send and read next.
m_pUdpServer.SendPacket(buffer, 0, Convert.ToInt32(bytes_count), m_pTargetEP);
sent_data += bytes_count;
}
if ((num * RAW_PACKET) + sent_data == BUFFERSIZE)
{
m_pTimer.Enabled = false;
}
m_pPacketsReceived.Text = m_pUdpServer.PacketsReceived.ToString();
m_pBytesReceived.Text = m_pUdpServer.BytesReceived.ToString();
m_pPacketsSent.Text = m_pUdpServer.PacketsSent.ToString();
m_pBytesSent.Text = m_pUdpServer.BytesSent.ToString();
}
如果我調用一個函數m_pUdpServer.SendPacket(buffer, 0, Convert.ToInt32(bytes_count), m_pTargetEP);
沒有計時器或任何循環(while等)我看到輸出正確的結果。
那麼這裏120 - 在每個定時器函數調用期間傳輸的文件部分數量。定時器功能被稱爲每秒2次。
BUFFERSIZE
是文件總大小。ReadBuffer
是一個包含所有PCM文件數據的數組。RAW PACKET
= 400字節。sent_data
是在每個定時器函數調用中發送的總字節數。num
是發送數據包的總數。
我想在定時器函數調用中要發送的包(字節)太多。因此,我看到輸出上的值不正確。
那麼這個問題的解決方案是什麼?
我想我可以組成一個RTP包(爲每個發送的包添加一個序列號)。它將幫助我識別收到的數據包並組成正確的接收數據包序列。如果收到的數據包有正確的字節序列,它可以幫助我。因爲如果收到的數據包有一個混合的字節順序(順序),我不明白如何在每個收到的數據包中恢復正確的字節順序。
我被建議拒絕定時器調用,並均勻地發送數據包,統一使用時間同步。其實我不知道該怎麼做。也許我應該使用線程,線程池或類似的東西。你怎麼看?
'SendTo'可能會發送少於'count'字節,* by design *。 –
....多數民衆贊成爲什麼它返回德'發送字節數 –
當你看到wireshark上的trame – Arthur