gpt4 book ai didi

c - 从客户端向服务器发送字符串时只接收到第一个字节

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:52 25 4
gpt4 key购买 nike

我制作了一个客户端/服务器程序,并将文件从客户端发送到服务器。

这是一段代码:

客户端:

FILE *f = fopen("file.txt" ,"r");
size_t bytes = 0;
while(bytes = fread(buffer ,sizeof(char) , sizeof(buffer) ,f)>0)
{printf("buff%s\n" , buffer);
send(sockfd ,buffer ,bytes , 0);
}
fclose(f);
printf("%s\n",buffer);

服务器端:

FILE *f = fopen("file1.txt" ,"w");
while(bytes = recv(newsockfd ,buffer , sizeof(buffer) ,0)>0)
{
printf("bytes%d" , bytes);
fwrite(buffer,sizeof(char) ,bytes , f);
}
bytes = recv(newsockfd ,buffer , sizeof(buffer) ,0);
printf("bytessss%d" , bytes);
fclose(f);
printf("Here is the message: %s\n",buffer);
close(newsockfd);

但是当我将它发送到服务器时,服务器会创建一个文件并只存储第一个字节,例如当我发送“hi whats up”时,服务器只存储“h”。

最佳答案

你错过了一个括号:

while(bytes = recv(newsockfd ,buffer , sizeof(buffer) ,0) > 0)

这使得 bytes 变量为 1 或 0,因为表达式计算为 recv(newsockfd ,buffer , sizeof(buffer) ,0) > 0 尽管读取的字节是正确的。像这样添加括号:

while ((bytes = recv(newsockfd ,buffer , sizeof(buffer) ,0)) > 0)
^ ^

错过了,但这同样适用于您的客户端,您将所有字节读取到缓冲区,但是 bytes 变量再次被赋值为 1,因为

while(bytes = fread(buffer ,sizeof(char) , sizeof(buffer) ,f)>0)

是这样计算的:

while(bytes = (fread(buffer ,sizeof(char) , sizeof(buffer) ,f)>0) )
^
1. call fread, keep the result in temporary place (let's call it X)
^
2. compare "x" to 0
^
3. store result of comparison (instead of fread) in the variable bytes.

意思是,从文件中读取sizeof(buffer)字节,如果读取的字节数大于0,则将1放入bytes,否则将0( bool 表达式的结果是 1 (true) 或 0 (false)),所以即使你读取 100 个字节,缓冲区确实充满了它们,但是 bytes 变量等于 1 所以你发送 1 个字节。当您尝试再次阅读时,没有任何内容可读,因为上次您已经阅读了 100 个字节。额外的括号使其首先将读取的字节数分配给 bytes 变量,然后才将其与 0 进行比较:

while((bytes = fread(buffer ,sizeof(char) , sizeof(buffer) ,f))>0)

关于c - 从客户端向服务器发送字符串时只接收到第一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6952544/

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