• 大小: 3KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-08
  • 语言: C/C++
  • 标签: 网络技术  帧发送  

资源简介

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

评论

共有 条评论

相关资源