2016-01-20 85 views
0

我有2臺電腦:我會稱它們爲Comp A,Comp B;服務器沒有收到所有消息

我不得不:

  1. 發送從小樣А到份B PCM格式的一個聲音文件;
  2. 驗證此文件傳輸的準確程度;
  3. 玩什麼我發送給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包(爲每個發送的包添加一個序列號)。它將幫助我識別收到的數據包並組成正確的接收數據包序列。如果收到的數據包有正確的字節序列,它可以幫助我。因爲如果收到的數據包有一個混合的字節順序(順序),我不明白如何在每個收到的數據包中恢復正確的字節順序。

我被建議拒絕定時器調用,並均勻地發送數據包,統一使用時間同步。其實我不知道該怎麼做。也許我應該使用線程,線程池或類似的東西。你怎麼看?

+0

'SendTo'可能會發送少於'count'字節,* by design *。 –

+0

....多數民衆贊成爲什麼它返回德'發送字節數 –

+0

當你看到wireshark上的trame – Arthur

回答

1

UDP給你的唯一保證就是傳遞了整個消息。但是,如果您發送1,2,3,4片段以便它們可以以任何順序接收,例如4132.即,UDP不保證排序。

您必須包含一個序列號才能正確存儲PCM。

UDP不保證傳遞。如果服務器在X秒內收到第4部分而不是第5部分,則應該再次請求該部分。

或者您將切換到TCP。更容易。您只需要一些方法來告訴文件的長度,然後將其傳輸。

相關問題