在C作业任务中用线程表示路由表
所以,我在学校里被分配了这个任务,到目前为止,这让我发疯。我不知道如何开始,我一定会很高兴得到一些帮助。 任务被翻译了,所以我对翻译的结果感到非常抱歉,我警告你们,翻译得非常糟糕 这是我在这个任务中遇到的另一个问题,翻译很糟糕,我没有它的原始来源 任务: 线程中的路由表 导言 网络计算机(本地或广泛)有多台计算机(节点)位于不同的位置 要将信息从一个交叉点发送到另一个交叉点,交叉点并不总是在节点线之间找到直接链接。在这种情况下,我们将不得不通过路线发送 一些节点。 两个无法发送它们的节点之间可能根本没有连接。 网络节点可以用邻接矩阵表示,1表示节点之间的直接链接,0表示没有这种关系 12345 1110 1 210 1 301 0 401 0 5110 真实的网络节点也可能临时或最终消失,因此需要不断更新连接表 在主要练习中,我们假设节点不会消失或停止工作,即使是一次 而在第4节(奖金)中,节点可以更改 任务描述 系统中的每个节点都将由线程表示。该计划的目的是: 从节点和链路的初始网络接收数据,并更新全局路由表。 每个线程都需要在其表的行(和列)上工作,如果它与节点没有直接接触, 然后搜索是否存在间接连接,如果通过其他节点发现是间接连接,则线程将在表中标记此连接 表将是一个数字,象征着关系的权重——如果它不只是连接点之间的话 如果三个拱门的重量为3,则其中一个拱门的弧数为0,重量为0,依此类推。 例如:1和4之间的关系 上表是3.的权重。第一个线程主要需要做一些事情:在C作业任务中用线程表示路由表,c,multithreading,networking,routing,task,C,Multithreading,Networking,Routing,Task,所以,我在学校里被分配了这个任务,到目前为止,这让我发疯。我不知道如何开始,我一定会很高兴得到一些帮助。 任务被翻译了,所以我对翻译的结果感到非常抱歉,我警告你们,翻译得非常糟糕 这是我在这个任务中遇到的另一个问题,翻译很糟糕,我没有它的原始来源 任务: 线程中的路由表 导言 网络计算机(本地或广泛)有多台计算机(节点)位于不同的位置 要将信息从一个交叉点发送到另一个交叉点,交叉点并不总是在节点线之间找到直接链接。在这种情况下,我们将不得不通过路线发送 一些节点。 两个无法发送它们的节点之间可能
- 将用户的节点数吸收到02
- 用户按以下方式选择网络拓扑: id1 id2 id5;id2 id3 id5;id3-id4; 榜样;1 2 5 , 2 3 5 ; 3 4标记列表节点的直接邻居的结束 表示:节点1与0和5相关,节点0也与3和5相关,节点3与4相关
- 创建初始连接表并显示在屏幕上
- 根据节点数量创建适当数量的线程
- 等待所有线程
- 在所有线程完成并将有更多更新后,程序将显示主表
- 以适当的消息结束最终表格网络
- 在删除我们构建的所有对象(例如线程属性)后结束程序 互斥体、互斥体属性、条件变量、条件变量 属性
- 寻找一个可能的链接路由(递归)所有与之无关的节点 直接的。如果发现新联系人,则通过查找最小重量更新表格
- 并发为了模拟真实的系统,建议每个线程在搜索前随机休眠一段时间
- 线程应该记住查找最短路径,并将其打印为最终搜索 例子: 线程N通过以下方式连接到M:N->node1->node2->M
- 如果线程和更新表-在他完成之前也打印他的行 使用适当的消息更新了表: 线程更新了第N行-现在的连接为:1 0 2 1 4 正在关闭线程N-未更新网络表或 无需打印关于更新单个值的消息-只需在完成该行时发布即可
- 对每个节点使用
pthread\t
- 使用管道
对连接进行建模。 将管道放入矩阵中man 2管道
其中,int connections[NUMTHREADS][NUMTHREADS][2];
是节点connections[i][j][0]
从i
接收的读取端(按列),而j
是节点connections[i][j][1]
发送到j
的写入端(按行)。请注意,i
是无效的文件描述符-1
- 让每个线程
(select
)在其有效读取端等待接收数据,然后通过TTL广播到它连接到的所有节点(这样就不会得到无限循环)man2select
- 让所有节点定期广播某种最短路径同步消息。然后,每个接收器可以不时地调整到每个节点的最短路径。让您的
为此选择
超时
这是一项相当大的任务。这里没有人会帮你编写整个代码,但我会给你一些提示
这里是主练习的一个实现,没有奖金,所以节点不会改变。为简单起见,最大节点数为9
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <pthread.h>
// A route is stored in the routing table as an integer number with the nodes
// from start to end represented by the decimal digits from lowest to highest.
int routelg(int rt)
{ // compute the length of a route
int lg = 0;
while (rt) ++lg, rt /= 10;
return lg;
}
void display(int n, sig_atomic_t table[n][n])
{
int k, l;
printf(" "); for (k = 0; k++ < n; ) printf(" %d", k); puts("");
printf(" "); for (k = 0; k++ < n; ) printf("--"); puts("");
for ( l = 0; l < n; ++l, puts(""))
for (printf("%d|", 1+l), k = 0; k < n; ++k)
printf("%d ", routelg(table[l][k]));
}
int n;
sig_atomic_t (*global_routing_table)[];
#define IN(lo, hi, num) lo <= num && num <= hi
int router(sig_atomic_t table[n][n], int origin, int destin, int visited[n])
{ // looking for a possible link route (recursively)
int hops = table[origin][destin], hop, hopmin = 999999999, l;
if (hops) return hops; // already have the path
visited[origin] = 1;
for (l = 0; l < n; ++l)
if (IN(11, 99, table[origin][l]) && !visited[l])
{ // directly connected and not already tried
hop = router(table, l, destin, visited);
if (hop && hop < hopmin) hopmin = hops = hop*10+1+origin;
}
visited[origin] = 0;
return hops;
}
void *route(void *arg)
{
int i = (int)arg, k, visited[n], rt;
sig_atomic_t (*table)[n] = global_routing_table;
for (k = 0; k < n; ++k)
if (!table[i][k]) // no route (yet) from here (i) to node k
{
memset(visited, 0, sizeof visited);
rt = table[i][k] = router(table, i, k, visited);
flockfile(stdout);
printf("%d %sconnected to %d", 1+i, rt ? "" : "un", 1+k);
char *del;
for (del = " by:"; rt; rt /= 10, del = "->")
printf("%s %d", del, rt%10);
puts("");
funlockfile(stdout);
}
return NULL;
}
int main()
{
printf("number of nodes (max 9)? "), scanf("%d", &n);
printf("topology of the network? ");
sig_atomic_t table[n][n];
int i;
memset(table, 0, sizeof table);
for (i = 0; i < n; ++i) table[i][i] = 1+i;
do
{ int neighbours[n];
for (i = 0; scanf("%d ", &neighbours[i]) > 0; ++i) ;
int o = neighbours[0];
while (--i > 0) table[o-1][neighbours[i]-1] = o+10*neighbours[i],
table[neighbours[i]-1][o-1] = neighbours[i]+10*o;
} while (getchar() == ';');
puts("initial connectivity table:"), display(n, table);
pthread_t threads[n];
global_routing_table = table;
for (i = 0; i < n; ++i) pthread_create(threads+i, NULL, route, (void *)i);
for (i = 0; i < n; ++i) pthread_join(threads[i], NULL);
puts("final table (0 - no route, 1..n - weight+1):"), display(n, table);
}
#包括
#包括
#包括
#包括
//路由在路由表中存储为带有节点的整数
//从开始到结束由从低到高的十进制数字表示。
国际航线(国际航线)
{//计算路线的长度
int lg=0;
而(rt)++lg,rt/=10;
返回lg;
}
无效显示(int n,sig_原子表[n][n])
{
int k,l;
printf(“”);对于(k=0;k++