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

时间:2011-08-05 06:54:25

标签: c linux sockets file-io

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

以下是一段代码:

客户方:

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”。

2 个答案:

答案 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

我认为那个人和你一样有同样的问题......