gpt4 book ai didi

c++ - 无法通过 C 中的 UDP 套接字接收完整整数数组

转载 作者:行者123 更新时间:2023-11-30 20:12:44 25 4
gpt4 key购买 nike

这是我的发送方代码

void send_data(int port, int coords[4]){

struct sockaddr_in si_me, si_other;
int s, i, slen = sizeof(si_other), recv_len;
char buf[BUFLEN];

//create a UDP socket
if((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
err_print("socket");
}

//zero out the structure
memset((char*)&si_me, 0, sizeof(si_me));

si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = htonl(INADDR_ANY);

//bind socket to the port
if(bind(s, (struct sockaddr *)&si_me, sizeof(si_me) ) == -1){
err_print("bind");
}
int size = sizeof(coords);
printf("Size: %d\n", size);
//Keep listening for data
while(1){
printf("Waiting for Data\n");
fflush(stdout);

memset(buf, 0, BUFLEN);
//try to receive some data, this is a blocking call
if((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr*) &si_other, &slen)) == -1){
err_print("recvfrom()");
}

//print details of the client/peer and the data received
printf("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
printf("%s\n", buf);

if(!strcmp(buf, "coords")) {

printf("Sending Coordinates: \n");
//now reply the client with the same data
int siz = sendto(s, coords, sizeof(coords), 0, (struct sockaddr*) &si_other, slen);
if(siz == -1){
err_print("sendto()");
}
printf("Siz: %d\n", siz);

}

break;
}

}

close(s);
}

从sendto返回的值是8,这是int数组的正确大小,但在接收端recvfrom返回0,尽管数组接收前两个整数元素,并且当我打印数组时其余的都是垃圾值。这是接收方代码:

void get_data(int port, int coords[]){

struct sockaddr_in si_other;

int s, i;
char message[BUFLEN];

if((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
err_print("socket");
}

memset((char*)&si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;

si_other.sin_port = htons(port);
si_other.sin_addr.s_addr = inet_addr(SERVER);

if(inet_aton(SERVER, &si_other.sin_addr) == 0){
fprintf(stderr, "inet_aton() failed\n");
exit(1);
}

socklen_t slen = sizeof(si_other);


int size = sizeof(coords);
printf("Size: %d\n", size);
int siz = 0;
while(1)
{
printf("Enter message : ");
strcpy(message, "coords");

//send the message
if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen)==-1)
{
err_print("sendto()");
}

//try to receive some data, this is a blocking call

if (siz = (recvfrom(s, coords, 8, 0, (struct sockaddr *) &si_other, &slen)) == -1)
{
err_print("recvfrom()");
}
printf("Siz: %d\n", siz);

break;
}

for(int j = 0; j<4; j++){
printf("C: %d\n", coords[j]);
}



close(s);

return;
}

坐标数组的输出在接收端:1 2 4196592 0现在,我想,也许整个数组没有被发送,但是 sendto 返回的大小值是 8,recvfrom 返回的大小值是 0,即使它正确获取了前两个元素。另外,请注意,在编译时,我收到 sizeof 警告:数组函数参数“coords”上的“sizeof”将返回“int *”的大小

这里可能出了什么问题,发送数组的正确方法是什么?如果可能的话,是否也可以发送双数组?

最佳答案

这里的线索是问题中的主张是 sizeof(coords),一个 4 元素 int 数组,结果为 8。

当然,只有在这个实现中 sizeof(int) 为 2 时才会出现这种情况。我想 16 位平台如今并非完全闻所未闻,尤其是在嵌入式领域。但后来有人声称打印 int 也会得到 4196592,当然,对于两字节 int 来说,情况不可能如此。

唯一的解释是这里给出的例子遗漏了关键信息。调用 sendfrom() 的代码不会直接访问 coords 数组。最有可能的是,coords 数组作为参数传递给该函数。当然,这会将其转换为 int *,其 sizeof 为 8,从而导致仅通过套接字发送前两个四字节 int 值。这也是对编译器警告的解释。

谁知道接收端会发生什么。

关于c++ - 无法通过 C 中的 UDP 套接字接收完整整数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34481156/

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