Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C作业任务中用线程表示路由表_C_Multithreading_Networking_Routing_Task - Fatal编程技术网

在C作业任务中用线程表示路由表

在C作业任务中用线程表示路由表,c,multithreading,networking,routing,task,C,Multithreading,Networking,Routing,Task,所以,我在学校里被分配了这个任务,到目前为止,这让我发疯。我不知道如何开始,我一定会很高兴得到一些帮助。 任务被翻译了,所以我对翻译的结果感到非常抱歉,我警告你们,翻译得非常糟糕 这是我在这个任务中遇到的另一个问题,翻译很糟糕,我没有它的原始来源 任务: 线程中的路由表 导言 网络计算机(本地或广泛)有多台计算机(节点)位于不同的位置 要将信息从一个交叉点发送到另一个交叉点,交叉点并不总是在节点线之间找到直接链接。在这种情况下,我们将不得不通过路线发送 一些节点。 两个无法发送它们的节点之间可能

所以,我在学校里被分配了这个任务,到目前为止,这让我发疯。我不知道如何开始,我一定会很高兴得到一些帮助。 任务被翻译了,所以我对翻译的结果感到非常抱歉,我警告你们,翻译得非常糟糕

这是我在这个任务中遇到的另一个问题,翻译很糟糕,我没有它的原始来源

任务: 线程中的路由表

导言

网络计算机(本地或广泛)有多台计算机(节点)位于不同的位置

要将信息从一个交叉点发送到另一个交叉点,交叉点并不总是在节点线之间找到直接链接。在这种情况下,我们将不得不通过路线发送 一些节点。 两个无法发送它们的节点之间可能根本没有连接。 网络节点可以用邻接矩阵表示,1表示节点之间的直接链接,0表示没有这种关系

12345

1110 1

210 1

301 0

401 0

5110

真实的网络节点也可能临时或最终消失,因此需要不断更新连接表

在主要练习中,我们假设节点不会消失或停止工作,即使是一次

而在第4节(奖金)中,节点可以更改   任务描述   系统中的每个节点都将由线程表示。该计划的目的是: 从节点和链路的初始网络接收数据,并更新全局路由表。 每个线程都需要在其表的行(和列)上工作,如果它与节点没有直接接触, 然后搜索是否存在间接连接,如果通过其他节点发现是间接连接,则线程将在表中标记此连接

表将是一个数字,象征着关系的权重——如果它不只是连接点之间的话

如果三个拱门的重量为3,则其中一个拱门的弧数为0,重量为0,依此类推。 例如:1和4之间的关系 上表是3.的权重。第一个线程主要需要做一些事情:

  • 将用户的节点数吸收到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
    man2select
    )在其有效读取端等待接收数据,然后通过TTL广播到它连接到的所有节点(这样就不会得到无限循环)

  • 让所有节点定期广播某种最短路径同步消息。然后,每个接收器可以不时地调整到每个节点的最短路径。让您的
    为此选择
    超时


  • 这里是主练习的一个实现,没有奖金,所以节点不会改变。为简单起见,最大节点数为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++