gpt4 book ai didi

c - 这是使用 C 通过 UDP 发送二进制数据的正确方法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:59:33 24 4
gpt4 key购买 nike

我接到了一项任务,要编写一些软件来从我们的嵌入式 Linux 设备与服务器进行通信。我要与之通信的服务器使用严格的协议(protocol),该协议(protocol)非常模糊和专有 - 我不想在这里命名它,因为这些信息可能对我工作的公司敏感。

所以数据必须是 4 位半字节 (N)、32 位无符号整数 (U)、32 位有符号整数 (S)、8 位无符号整数 (X) 和字符 (C) 的形式之一。因此,例如,简化的登录结构可能是 NNNN-用户 ID,后跟 XX-更多数据,CCCC-访问代码。所以我需要按顺序发送 NNNNXXCCCC 才能登录。

数据需要通过UDP发送,然后在同一个端口上监听确认。所以我这样做的方法是编写一个 send_and_receive 函数,然后编写一个结构,以将结构发送到服务器。

     typedef u_int8_t NN;
typedef u_int8_t X;
typedef int32_t S;
typedef u_int32_t U;
typedef char C;

#pragma pack(1)

typedef struct{

NN user_id[2];
X some_data[2];
C access_code[4];
} LogOnRequest;

然后我声明并填写结构的信息并使用此函数发送它:

void send_and_receive(void* message, void* reply, int do_send, int expect_reply){
struct sockaddr_in serv_addr;
int sockfd, i, slen=sizeof(serv_addr);
int buflen = BUFLEN;
void* buf = NULL;

if ( (strlen(message)) >= BUFLEN)
err("Message too big");

buf = malloc(buflen);

if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
err("socket");

bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if (inet_aton(IP_ADDRESS, &serv_addr.sin_addr)==0)
err("inet_aton() failed\n");

if(do_send == TRUE){
strcpy(buf, message);
if (sendto(sockfd, buf, buflen, 0, (struct sockaddr*)&serv_addr, slen)==-1)
err("sendto()");
}

if (expect_reply == TRUE){
if (recvfrom(sockfd, buf, buflen, 0, (struct sockaddr*)&serv_addr, &slen)==-1)
err("recvfrom()");
}

memcpy(reply, buf, BUFLEN);
close(sockfd);
free(buf);
}

现在,当我这样做时,我没有收到回复,也没有注意到服务器已收到数据包。基本上我想知道我这样做是否正确,有没有更好的方法?是否可以使用 bash 脚本做同样的事情?

任何反馈都会很好,因为我对这个反馈感到力不从心。

最佳答案

您需要等待一段时间才能得到回复。如果没有得到,则需要重新发送查询并再次等待。 UDP 是一种“尽力而为”的交付服务,没有任何内置重试。

您还需要确保发送多字节值的方式与另一端期望的方式相同。哪个字节在前?

关于c - 这是使用 C 通过 UDP 发送二进制数据的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18882103/

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