【问题标题】:Using raw sockets in C在 C 中使用原始套接字
【发布时间】:2021-06-11 10:54:34
【问题描述】:

在 C 中使用原始套接字时,我试图设置 tcp 数据包的最大段大小,并且在尝试实现之前提出的问题的答案时遇到编译错误 -> setting the maximum segment size in the tcp header

我在谷歌上尝试过其他东西,忘记记录我的试验和他们犯的错误。我有我最近的尝试,我会在这里发布。

struct tcp_option_mss {
    uint8_t kind; /* 2 */
    uint8_t len; /* 4 */
    uint16_t mss;
} __attribute__((packed));

struct tcp_option_mss mss;
mss.kind = 2;
mss.len = 4;
mss.mss = htons(32000);

struct tcphdr_mss {
    struct tcphdr tcp_header;
    struct tcp_option_mss mss;
};

void setup_tcp_header(struct tcphdr *tcp_hdr)
{
    struct tcphdr_mss *tcp_header;

    tcp_header = malloc(sizeof(struct tcphdr_mss));

    tcp_hdr->source = htons(5678);
    tcp_hdr->seq = rand();
    tcp_hdr->ack_seq = 0;
    tcp_hdr->res2 = 0;
    tcp_hdr->doff = 5;
    tcp_hdr->syn = 1;
    tcp_hdr->window = htons(0);
    tcp_hdr->check = 0;
    tcp_hdr->urg_ptr = 0;

    tcp_header->mss.kind = 2;
    tcp_header->mss.len = 4;
    tcp_header->mss.mss = htons(32000);
}

有了这个,我得到了 3 个错误,每个错误都在 mss。行,说。出乎意料

error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 mss.kind = 2;

这只是其中的 1 个错误,其他 2 个相同,仅针对其他 2 个 mss。线。如果您有任何解决此编译问题的提示/如果您知道我的代码设置是否不起作用,请给我一个提示。此外,如果有办法将我的代码压缩到更少的行,也将不胜感激!谢谢!!

【问题讨论】:

    标签: c tcp raw-sockets


    【解决方案1】:

    这一行是执行赋值的语句:

    mss.kind = 2;
    

    可执行语句(包括函数调用)不能存在于函数之外。

    您可以在定义mss 时对其进行初始化,但您将无法调用htons。相反,您需要在函数内移动这些行。

    但是,您的代码似乎没有使用mss,因此您可以将其完全删除。

    另外,请注意您在上一个问题中接受的关于设置 tcp 标头结构的函数的答案。您的功能与该功能不同。

    【讨论】:

    • 天哪,我什至没有注意到!我通常使用 javascript,而 C 让我感到困惑。很抱歉,当我引用的问题的答案如此明显时,我问了这个问题:/希望你有美好的一天。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多