网络编程与协议分析常见问题解析

网络编程与协议分析核心问题解析

1、如何发现所在网络拓扑的相关信息?

可使用大多数Unix系统提供的 `netstat` 和 `ifconfig` 这两个基本命令来发现网络的一些细节。具体操作如下:

1. 使用 `netstat -i` 命令获取接口信息,建议同时指定 `-n` 标志以打印数字地址。例如在Linux系统中执行 `netstat -ni` 可查看接口及其名称;在支持IPv6的FreeBSD系统中执行该命令能获取更多接口相关信息。

2. 使用 `netstat -r` 命令查看路由表,同样建议指定 `-n` 标志打印数字地址,此命令还能显示默认路由器的IP地址。

可通过查看系统中这些命令的手册(man)页面了解输出信息的详细情况,同时要注意有些厂商会将这些命令放在 `/sbin` 或 `/usr/sbin` 等管理目录中,而这些目录可能不在正常的shell搜索路径(PATH)中。

2、获取TCP日间客户端程序的源代码。编译并测试该程序。多次运行该程序,每次在命令行参数中指定不同的IP地址。

首先获取TCP日间客户端程序的源代码。使用合适的编译器(如假设使用ANSI C编译器)对代码进行编译。编译完成后,运行生成的可执行文件,每次运行时在命令行中指定不同的IP地址作为参数,以此来测试程序。

3、在以太网主机(其TCP通告的MSS为1460)和令牌环网主机(其TCP通告的MSS为4096)之间建立了连接,两台主机都未实现路径MTU发现。观察数据包,发现任一方向的数据都不超过1460字节。这是为什么?

MSS的作用是告知对端TCP每个分段可发送的最大TCP数据量,目的是告知对端重组缓冲区的实际大小并避免分片。在这种连接中,两端会采用较小的MSS值来发送数据,以确保数据能在双方都可接受的范围内传输。由于以太网主机通告的MSS为1460,小于令牌环网主机通告的4096,所以双方都以1460字节为上限发送数据,因此看不到超过1460字节的数据。

4、为什么像套接字地址结构长度这样的值 - 结果参数必须通过引用传递?

因为该长度在函数调用时是一个值,它告知内核结构的大小,使内核在填充结构时不会越界;在函数返回时是一个结果,它告知进程内核实际存储在结构中的信息有多少。通过引用传递才能让函数更新其值。

5、编写一个名为inet_pton_loose的新函数,处理以下情况:如果地址族是AF_INET且inet_pton返回0,则调用inet_aton并查看是否成功。同样,如果地址族是AF_INET6且inet_pton返回0,则调用inet_aton,如果成功,则返回IPv4映射的IPv6地址。

以下是实现 inet_pton_loose 函数的示例代码:

#include <arpa/inet.h>
#include <string.h>
#include <errno.h>

int inet_pton_loose(int family, const char *strptr, void *addrptr) {
    int result = inet_pton(family, strptr, addrptr);
    if (result == 0) {
        if (family == AF_INET) {
            struct in_addr in_val;
            if (inet_aton(strptr, &in_val)) {
                memcpy(addrptr, &in_val, sizeof(struct in_addr));
                return 1;
            }
        } else if (family == AF_INET6) {
            struct in_addr in_val;
            if (inet_aton(strptr, &in_val)) {
                struct in6_addr *in6_val = (struct in6_addr *)addrptr;
                memset(in6_val, 0, sizeof(struct in6_addr));
                in6_val->s6_addr[10] = 0xff;
                in6_val->s6_addr[11] = 0xff;
                memcpy(&in6_val->s6_addr[12], &in_val.s_addr, sizeof(in_val.s_addr));
                return 1;
            }
        }
    }
    return result;
}

代码解释:

  1. 调用 inet_pton :首先调用 inet_pton 函数尝试将字符串形式的地址转换为二进制地址。
  2. 检查返回值 :如果 inet_pton 返回0,表示输入不是有效的表示格式。
  3. 处理 AF_INET 情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值