我制作了一个客户端/服务器程序,并将文件从客户端发送到服务器。
以下是一段代码:
客户方:
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”。
答案 0 :(得分:4)
你错过了一个括号:
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(布尔表达式的结果为1(true) )或0(假)),所以即使你读了100个字节,缓冲区确实填充了它们,但bytes
变量等于 1 所以你发送 1字节即可。当你再次尝试阅读时,没有什么可读的,因为上次你已经阅读了100个字节。额外的括号使它首先将读取的字节数分配给bytes
变量,然后将其与0进行比较:
while((bytes = fread(buffer ,sizeof(char) , sizeof(buffer) ,f))>0)
答案 1 :(得分:0)
正如前面的答案所解释的那样,优先规则是代码中唯一的问题。
<强>&GT;优先级高于=。
我认为下面给出的问题的前两个答案会对你有帮助....
C write() function not working
我认为那个人和你一样有同样的问题......