【问题标题】:read() on client side failing C客户端上的 read() 失败 C
【发布时间】:2014-04-25 05:11:06
【问题描述】:

我在将整数从服务器传递到客户端的 read() 语句中遇到问题。问题是我可以很好地向服务器发送 2 个整数,但由于某种原因,客户端无法从服务器接收除 0 以外的任何内容。有人可以向我解释一下这个 while 循环到底发生了什么吗?这似乎是 C 套接字中的标准做法,但我无法弄清楚它真正完成了什么(如果有的话)。

memset(rbuffer,0,sizeof(rbuffer));
while ( (n = read(sockfd, rbuffer, sizeof(rbuffer))) > 0)
{
    rbuffer[n] = 0;
}

这是客户端的读取尝试,其中 rbuffer 应该接受单个整数。它似乎尝试从服务器反复读取(接收 n > 0 直到服务器关闭套接字),其中在套接字关闭之前的最后一次读取实际上保存了数据,因此,rbuffer 设置为 0 直到完成,它然后用来自服务器的数据填充。

服务器端发送给客户端的代码如下所示:

int g = dijkstra(source, destination, numNodes);
printf("The value sent to client is %d.\n", g);
write(connfd, g, sizeof(g));

close(connfd);
  sleep(1);

原始代码显示为:

int g = dijkstra(source, destination, numNodes);
sprintf(sendBuff,"%d", g);
write(connfd, sendBuff, strlen(sendBuff)); 

close(connfd);
  sleep(1);

但我想在客户端将其读取为整数,因此我删除了 sendBuff,因为在发送 int 时似乎没有必要,考虑到 g 已经设置。

感谢您的帮助。我想要的是更好地理解 C 中 TCP 套接字的服务器到客户端通信,特别是 read 需要等待服务器响应,还是已经这样做了?另外,去掉读取的while循环没有任何效果,服务器对*buffer的响应仍然为0。

【问题讨论】:

    标签: c sockets client


    【解决方案1】:

    你不能使用write(connfd, g, sizeof(g));write 函数需要一个 char 指针作为第二个参数,你给它一个 int。不用说,您的原始客户端可能还需要一个字符串,用字符填充 rbuffer,并添加结尾零 (rbuffer[n] = 0) 以便能够将其用作提取整数的字符串。您可能在客户端有一个 sscanf()。

    字面意思想要做的是这个

    write(connfd, (char*)&g, sizeof(g));
    

    并且可以这样接收它,在此之后,g 成为int

    g = *((int*)rbuffer);
    

    但我什至不应该提出这个,因为它不是正确的代码......

    【讨论】:

    • 我认为在 C 中,char 数组与 int 数组相同,但以 null 结尾(以防止超出范围)。我还读到,考虑到您的 sizeof 配置正确,write 和 read 可以处理任何数据(例如:int[3] 将是 sizeof(int)*3)。
    • 您的第一个假设是错误的,char 不是 int,并且 char 数组在用作字符串时仅按惯例以空值结尾。不过,您的第二部分是正确的,但是您的变量 g 是一个 int,不是 int 数组,也不是指向 int 的指针。
    • 谢谢,我读过 scanf() 可以分隔分隔的字符串并将它们拆分为整数,所以我想我会回到使用字符串并使用 scan f 来提取数字而不是尝试当 write 不打算这样做时,强制来回发送整数。感谢您澄清 read() 和 write()。
    • 有一些方法可以优雅地使用二进制通信。如果你想发送和接收多个值,你可以创建和发送一个客户端和服务器都知道的结构。不要误会我的意思,我不喜欢从 int 到 char* 的类型转换,但是使用显式约定将字节数组 (char*) 转换为您的值是可以接受的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2021-11-10
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多