gpt4 book ai didi

c - 在c套接字编程中接收反向数据

转载 作者:行者123 更新时间:2023-12-04 12:22:11 26 4
gpt4 key购买 nike

我想编写一个 c 程序来监听套接字并获取特定 TCP 协议(protocol)的有效负载并发送响应。我在为响应数据包字段赋值时遇到问题。

首先我创建了协议(protocol)数据包结构:

struct header {
unsigned int field_1:32;
unsigned int field_2:32;
unsigned int field_3:32;
unsigned int field_4:32;
}

struct request {
struct header req_hdr;
char req_body[100];
}


struct response {
struct header resp_hdr;
char resp_body[16];
}

服务器套接字收到请求后,向客户端发送响应。为此,我首先创建一个响应结构:

struct  response *resp;
resp = calloc (1, sizeof (struct response));

然后我用适当的值填充响应数据包字段。 resp->header.field_1 必须是 body PDU 的长度。我以这种方式分配它:

resp->header.field_1=strlen(resp->resp_body); 

还有一个必须分配给 resp->header.field_2 的十六进制值。我将这个十六进制数转换为整数,然后将其分配给 resp->header.field_2。因为在协议(protocol)文档中 resp->header.field_2 必须是整数而不是字符串。 0x80000009 等价的整数是 2147483657,所以我这样分配给客户端:

resp->header.field_1=2147483657;

我在客户端系统上使用 tshark 来检查服务器发回的响应。我得到这样的数据包:

04000000 09000080 00000000 00000001 74657374000000000000000000000000

第一个左字节是resp->header.field_1,第二个是resp->header.field_2这是问题所在:resp->header.field_1 必须是 00000004 而 resp->header.field_2 必须是 80000009 但看起来它们是reversed (rest fields are ok) 导致响应包不能被客户端识别。我怎样才能正确地将这些值分配给他们的领域?

最佳答案

在您的服务器程序中,您需要将响应 header 整数从主机字节流转换为网络顺序。您应该首先在其上使用 htons()htonl()。如果您在 clinet 中接收整数,则应使用 ntohs()ntohl()

关于c - 在c套接字编程中接收反向数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59031607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com