在 C 中使用原始套接字

Using raw sockets in C

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

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

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。线。如果您有修复此编译的任何提示 issue/if 您知道我的代码设置是否不起作用,请给我提示。另外,如果有一种方法可以将我的代码压缩到更少的行,也将不胜感激!谢谢!!

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

mss.kind = 2;

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

您可以在 mss 定义的位置对其进行初始化,但您将无法调用 htons。您需要将这些行移到一个函数中。

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

此外,请记下您在上一个问题中接受的有关设置 tcp header 结构的函数的答案。你的功能与那个功能不一样。