介紹
我試圖使用線程使用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++;
}
以這種方式使用多線程不僅會_will_損壞數據,而且當每個線程都會阻塞網絡時效率不高。一個爲IOCP使用多個線程,但是這些線程不被綁定用於任何特定的任務或工作,而是被多路複用。對於你簡單地使用'async'和'await'無疑是最好的選擇 – MickyD
你可以只有一個連接具有以下三個參數1)源IP地址2)目標IP地址3)端口號。將消息拆分爲多個線程時,必須爲每個線程使用不同的端口號。然後爲每個消息線程添加一個id,以便可以將它組合回正確的順序。 – jdweng