клиент-серверная программа - PullRequest
0 голосов
/ 22 апреля 2009

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

Код можно увидеть здесь .

Спасибо!

цикл на стороне сервера:

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

Ответы [ 3 ]

1 голос
/ 22 апреля 2009

Во-первых, не используйте 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 голосов
/ 22 апреля 2009

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

0 голосов
/ 22 апреля 2009

В системах MS Windows в качестве окончания строки используется возврат каретки, в linux - просто перевод строки.

"Нечитаемый символ" - это Ctrl-M, возврат каретки, символ номер 13.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...