gpt4 book ai didi

c - recv() 没有从网络获取值

转载 作者:行者123 更新时间:2023-11-30 17:16:04 25 4
gpt4 key购买 nike

我有一个典型的客户端服务器C套接字程序。

SERVER:
if(ndp.cmd == 11)
{
//ack1 = 0;
puts("Query Command for Light 2");
pthread_mutex_lock(&lock);
// ..Some critical stuff
pthread_mutex_unlock(&lock);
printf("ID: %d, Level: %d\n", new.address, new.level);
ack1 = new.level; //This result is showing correct on server
ack1 = htonl(ack1);
send(client_sock, &ack1, sizeof(ack1), 0);
}

CLIENT:
printf("Query Actual level Light2\n");
dp.id = 2;dp.cmd = 11; dp.active = 0; dp.level = 0; dp.group = 0;
if( send(sock , &dp , sizeof(dp) , 0) < 0) { puts("Send failed"); }
sleep(1);
ret = recv(sock , &level1 , sizeof(level1) , 0);
printf("Number of bytes received: %d\n", ret); //Always gives 4
fflush(stdout);
printf("Light level %x\n", ntohl(level1) ); //This prints 0 (incorrect)
fflush(stdout);
sleep(5);


printf("Query Actual level Light2\n");
dp.id = 2;dp.cmd = 11; dp.active = 0; dp.level = 0; dp.group = 0;
if( send(sock , &dp , sizeof(dp) , 0) < 0) { puts("Send failed"); }
sleep(1);
ret = recv(sock , &level2 , sizeof(level2) , 0);
printf("Number of bytes received: %d\n", ret); // Always gives 4
fflush(stdout);
printf("Light level %x\n", ntohl(level2) ); //This prints correct value
fflush(stdout);
close(sock);

Expected output:
Light level 32 (hex value for 50);
Light level 32

Actual output:
Light level 0
Light level 32

所以问题出在相同的请求上,客户端没有收到服务器的第一次发送,但下一个recv()给出了正确的值。

为什么来自第一个recv()的数据丢失了,它是否被缓冲了,也许我在第二个recv()中得到了以前的值?

请帮忙。

最佳答案

你的假设没有错。它可能被缓冲。另请注意,当接收方读取数据的速度比发送方发送数据的速度快时,某些 recv 调用可能无法读取任何数据,因为发送方尚未发送任何数据。这可能就是您所描述的情况的原因。

更新:如果您计划始终发送/接收相同数量的数据,例如包含您的内容的 20 字节数据包定义为命令,然后您可以将 sendrecv 包装在循环中。该循环将一次写入(或读取)一个命令。您不能假设sendrecv的调用会成功,因此您必须检查错误,正如@Joachim提到的在评论中。另一件需要注意的事情是,recv 可能读取的字节数少于指定的字节数,因此您可能需要多次读取才能接收完整的命令。这同样适用于发送

关于c - recv() 没有从网络获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29796111/

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