資源簡介
1)、用兩個線程a和b來模擬Ethernet上的兩臺主機。
2)、用一個雙字類型變量Bus來模擬總線(將其初始化為” \0”,并且總線等于”\0”時
表示總線空閑)。
3)、兩個子線程向總線發送自己的數據。數據用該線程的線程號進行模擬,發送數據用線
程號和Bus的“或”操作進行模擬(即Bus=Bus|ID,ID為該線程的線程號)。
4)、每臺主機必須將總線上發送成功10次數據,如果其中某次數據發送失敗,則該線程結
束。
5)、發送流程必須遵循CSMA/CD。隨機延遲算法中的沖突窗口取0.005。在數據發送成功(
代碼片段和文件信息
#include?
#include?
#include?
HANDLE?hTread1?hTread2; //?線程句柄
DWORD?dwThreadId1?dwThreadId2;?//?線程ID號
DWORD?Bus?=?0; //?總線
DWORD?WINAPI?ThreadProcA?(?LPVOID?lpParam?)//線程a(主機a)
{
int?i?=?0;//發送成功次數
int?CollisionCounter?=?16;//沖突計數器初始值
double?collisionWindow?=?0.005;//沖突窗口取值
int?randNum?=?rand()%3;//隨機數
Loop:?if?(Bus==0)//總線空閑
{
Bus?=?Bus|dwThreadId1;//模擬發包
Sleep?(12);
if?(Bus?==?dwThreadId1) //?無沖突,數據發送成功
{
printf?(?“%d?Send?Success\n\n“?dwThreadId1?);
Bus?=?0;//內存清0
CollisionCounter?=?11;//恢復沖突計數器
Sleep?(rand()%10);//隨機延時
i++;
printf?(?“主機a發送成功次數=?%d\n\n“?i);
if?(i<10)//發送次數不足10次,開始下一次發送
goto?Loop;
}
else //?發生沖突,數據發送失敗
{
printf?(?“%d?Send?Collision\n\n“?dwThreadId1?);
Bus?=?0;
CollisionCounter--;//沖突計數器減1
if?(?CollisionCounter>0?)
{//隨機延遲重發,延遲算法用截止二進制指數后退算法
Sleep((unsigned?long)(randNum?*?(int)pow(2(CollisionCounter>10)?10:CollisionCounter)?*?collisionWindow));
goto?Loop;//下一次嘗試發送
}
else
{
printf?(?“%ld?Send?Failure\n\n“?dwThreadId1?);//重發次數超過16次,宣布發送失敗
}
}
}
else
goto?Loop;//總線忙,繼續載波偵聽
return?0;
}
DWORD?WINAPI?ThreadP
- 上一篇:二叉排序樹查找算法
- 下一篇:VC6.0工具DFView
評論
共有 條評論