2009-04-22 2 views
0

Мы создали простую программу client.c и server.c в среде UNIX. Мы используем его, переносим простой текстовый файл, сначала открывая его, затем читая его и отправляя с помощью системных вызовов open, read и send; на стороне клиента я получаю его и записываю его, создавая файл на серверной машине. Передача происходит довольно плавно, но файл, полученный на стороне клиента, не совсем то же самое на стороне сервера. Между читаемыми символами присутствуют некоторые нечитаемые символы. Не могли бы вы рассказать мне, что может быть причиной этого? Хотя большая часть файла такая же, только небольшая часть между ними имеет некоторые расхождения.клиент-серверная программа

Код можно видеть here.

Спасибо!

стороне сервера петли:

do 
{ 
    n=read(t,buf,100); 
    write(1,buf,strlen(buf)); 
    send(connected, buf,strlen(buf), 0);  
} while(n!=0); 

на стороне клиента

do 
{ 
    bytes_recieved=recv(sock,recv_data,100,0); 
    count=write(t,recv_data,strlen(recv_data));  
} while(bytes_recieved!=0); 
+0

пожалуйста показать код (или соответствующие фрагменты, в частности, читайте и записывайте петли) – Alnitak

+0

где я должен вставлять код. Должен ли я вставлять его здесь, только редактируя вопрос. Извините за этот вопрос, но я отношусь к этому форуму, и многие люди раздражаются, если мы что-то долго или что-то, что они, вероятно, не нравится. Спасибо – mawia

+0

Если у вас много кода, вы можете использовать какую-то плату для вставки и просто добавить ссылку. Если это небольшой код, вы можете задать его прямо в вопросе. В любом случае, вы должны отредактировать этот вопрос и добавить новую информацию. –

ответ

-2

системы MS Windows использовать возврат каретки-перевод строки как окончание строки, Linux с помощью только перевода строки.

«нечитаемый характер» Ctrl-M, возврат каретки, символ номер 13.

+1

нет, если их код не говорит так, это не так. Иногда stdio выполняет преобразование CRLF/CR, но системные вызовы чтения/записи не выполняются. – Alnitak

+0

стр. он также сказал, что это было под UNIX – Alnitak

+0

Вы не можете этого знать. Согласно OP, среда UNIX. Они не сказали клиента Windows на сервер UNIX. Это также может быть легко вызвано буферизацией или другой коррупцией. Мы не можем знать, пока они ничего не публикуют. –

0

Вы должны проверить посыл() S, чтобы увидеть, если у них получится. Вы можете обнаружить, что в какой-то момент буфер записи (т. Е. Выходной буфер сокета) заполнен и сообщение не работает. Это нормальное поведение. Send возвращает количество отправленных байтов. Если вы не отправляете многобайтовые символы, это, вероятно, будет проявляться в виде недостающих данных, а не для искаженных данных. Если вы потеряете один байт двухбайтового символа, это может привести к повреждению.

1

В первом случае не используйте strlen(). Нет абсолютно никакой гарантии, что в файловом потоке будет NUL-байт, а на самом деле с текстовым файлом никогда не должно быть.

Каждый раз вокруг петли следует вывести фактическое число байтов, которые были получены, а не сколько strlen() думает, может быть в буфере:

do 
{ 
    bytes_received = recv(sock, recv_data, 100, 0); 
    if (bytes_received < 0) { 
     perror("read"); 
     break; 
    } else if (bytes_received == 0) { 
     break; 
    } else { 
     count = write(t, recv_data, bytes_received); 
     // in theory - add error check here too! 
    } 
} while (count > 0); 
+0

Я удалил strlen и заменил recull return, но все еще есть одна и та же проблема некоторых (несколько) нечитаемых charachter.my. Второй вопрос мы можем использовать тот же механизм для отправки двоичного файла или любого другого файла, такого как песни и видео, или делать мы должны изменить программу для отправки такого типа файла. Спасибо! – mawia

+0

вам нужно изменить другую половину кода, чтобы не использовать strlen() либо - я показывал только половину. Как только это будет правильно, он переносит любой файл независимо от типа. – Alnitak