gpt4 book ai didi

c - 通过 UDP 发送时丢失数据

转载 作者:太空宇宙 更新时间:2023-11-04 05:19:23 25 4
gpt4 key购买 nike

我编写了一个 UDP 发送/接收函数来发送一个结构并监听另一个结构。字节必须按特定顺序发送,但在我使用 #pragma pack(1) 时这工作正常.我现在遇到的唯一问题是,如果有的话 Null值 ( 0x00 ) 出现在结构中,其余数据在 Null 之后消失。

我想我做错了一些相当简单的事情,但这是我的代码:

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

typedef struct{
X test;
NN test2[2];
C test3[4];
S test4;
} Test;

int main(int argc, char** argv)
{
Test t;
memset( &t, 0, sizeof(t));
t.test = 0xde;
t.test2[0]=0xad; t.test2[1]=0x00;
t.test3[0]=0xbe; t.test3[1]=0xef; t.test3[2]=0xde; t.test3[3]=0xca;
t.test4=0xde;

LogOnResponse response;

udp_send_receive(&t, &response);

return 0;
}

这是我的发送/接收函数:

int 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;
struct timeval tv;
int n_timeouts=1;
int recv_retval;

// printf("Message Size: %d\n", strlen(message));

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

buf = malloc(buflen);

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

tv.tv_sec = timeout_seconds;
tv.tv_usec = timeout_microseconds;
if( setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0 ){
err("Setting Timout");
}

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");

//---Timeout Send/Receive loop

do{
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( (recv_retval = recvfrom(sockfd, buf, buflen, 0, (struct sockaddr*)&serv_addr, &slen)) == -1){
itercount++;
}
}

}while ((itercount < itermax) && (recv_retval == -1));

if ( itercount != itermax ){
memcpy(reply, buf, BUFLEN);
}
else{
reply=NULL;
}

close(sockfd);
free(buf);
return 0;
}

void udp_send_receive(void* message, void* reply)
{
send_and_receive(message, reply, TRUE, TRUE);
}

运行上面的代码并使用 WireShark 捕获数据包显示:

Data: DEAD000000000000000000....

我希望它显示:

Data: DEAD00BEEFDECADE

我非常感谢对此的一些指示。

最佳答案

您不能对二进制数据使用字符串函数(如 strlenstrcpy)。这是因为字符串以零值(字符 '\0')结束。

例如,您使用 strcpy 复制数据,但它会在看到字符串终止符后立即停止,这意味着它不会复制所有数据。

关于c - 通过 UDP 发送时丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18914585/

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