2015-12-14 65 views
1

介紹

我試圖使用線程使用5個線程同時(制定可靠的UDP選擇性重複協議我會派例如5包送包以後添加確認和模擬損失)使用多線程在一個插座

我是一個初學者到socket編程,所以我不知道這種做法是正確的

所有的數據包都會發送,然後我在客戶端重新排序(附帶序列號) 。

-I在一個新的線程分割數據包轉換成字節中字節[]的列表,並添加序列號

-pass每個分組到子功能來發送(MAX然後5個線程等待) 當我使用一個線程來發送文件獲取發送成功 但是當我使用5個線程發送相同的數據包文件被損壞, (數據加擾)

所以當兩個線程調用Socket.Send會發生什麼(數據) ;

它是否同步?

我做了一些測試,這裏是結果 當我在每個線程之間等待時就開始了。這個問題去的方式(該文件被成功接收)

我試圖使發送功能被鎖定,因此它只能被一個線程在同一時間訪問,但沒有奏效

代碼的其他部分經過測試,所以我相信這是一個線程問題

那麼,如何使用多個線程使用相同的套接字發送數據包?

代碼

 for (i = 0; i < pck_count; i++) 
    { 


    while (EMPTY_THREADS <= 0);//wait for any thread to finish 
    //SIZE = windows size = is number of packets to send at one time =      threads no 
//then try to send SIZE (5) packets from it: 
int j = 0; 
for (j = 0; j < SIZE; j++) 
{ 



    if (j + i >= pck_count) 
    { 
     break; 

    } 
    //if packet not already sent , send it 
    if (!status[i + j].sent && (j + i < pck_count)) 
    { 
     // Console.WriteLine("Sending Packet:" + (i + j)); 

     status[i + j].sent = true; // 
     status[i + j].ack = true; // TO REMOVE 



     try 
     { 
      makeThread(Remote, j, i, newsocket); 
      // Thread.Sleep(150); // this makes it work 

     } 
     catch (Exception e) { 
      Console.WriteLine("ERROR:" + e.Message); 
     } 


    } 




} 

製作主題:

public static void makeThread(EndPoint Remote, int j,int i,Socket newsocket) 
    { 
     EMPTY_THREADS--; 
     thread[j] = new Thread(

       () => startChild(msgs[i + j], Remote, j,newsocket)); 
     thread[j].Start(); 

    } 

孩子:

static void startChild(myMessage packet, EndPoint Remote, int k,Socket newsocket ) 
    { 

    Console.WriteLine("Sending PACK" + packet.data.Length +" "+ packet.seq_no); 
    byte[] data = new byte[1024]; 



     newsocket.ReceiveTimeout = 1000; 

     int sentbytes = 0; 

    `//convert packet from object to data array 
     data = serialize(packet); 
     newsocket.Connect(Remote); 

      sentbytes = newsocket.Send(data); 

     //newsocket.Sendto(data,remote); //tried Sendto() with same effect 

    // newsocket.Close(); 
     EMPTY_THREADS++; 
    } 
+0

以這種方式使用多線程不僅會_will_損壞數據,而且當每個線程都會阻塞網絡時效率不高。一個爲IOCP使用多個線程,但是這些線程不被綁定用於任何特定的任務或工作,而是被多路複用。對於你簡單地使用'async'和'await'無疑是最好的選擇 – MickyD

+1

你可以只有一個連接具有以下三個參數1)源IP地址2)目標IP地址3)端口號。將消息拆分爲多個線程時,必須爲每個線程使用不同的端口號。然後爲每個消息線程添加一個id,以便可以將它組合回正確的順序。 – jdweng

回答

1

@Micky是的,你說得對這種方式是錯誤的,會破壞數據,該解決方案是使用單個線程和單個套接字在正常循環中發送數據包,並使用線程定時器s和確認