在 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 结构的函数的答案。你的功能与那个功能不一样。
在 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 结构的函数的答案。你的功能与那个功能不一样。