При отправке строки с клиента на сервер принимается только первый байт. - PullRequest
1 голос
/ 05 августа 2011

Я создал клиент-серверную программу и отправляю файл с клиента на сервер.

Вот фрагмент кода:

Сторона клиента:

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);

Но когда я отправляю его на сервер, сервер создает файл и сохраняет только первый байт, например, когда я отправляю "привет, что случилось", только сервермагазины "ч".

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

Вы пропускаете одну круглую скобку:

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 (false)), поэтому даже если вы прочитаете 100 байтов, буфер действительно заполнен ими, но переменная bytes равна 1 , поэтому вы отправляете 1 байт .когда вы пытаетесь читать снова, читать нечего, так как в прошлый раз вы уже прочитали 100 байтов .Из-за лишних скобок сначала присваивается число считанных байтов переменной bytes, а затем сравнивается с 0:

while((bytes = fread(buffer ,sizeof(char) , sizeof(buffer) ,f))>0)
0 голосов
/ 05 августа 2011

Как объясняет предыдущий ответ, правило приоритета - единственная проблема в вашем коде.

> имеет более высокий приоритет, чем =.

Я думаю, что первые 2 ответа на приведенный ниже вопрос помогут вам ...

Функция write () не работает

Я думаю, у этого парня была такая же проблема, как и у вас ...

...