资源简介
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
评论
共有 条评论