Отправка сообщения с сервера на клиент - PullRequest
2 голосов
/ 14 марта 2012

Я реализую как серверную, так и клиентскую часть простой программы загрузки файлов.Клиентская сторона запрашивает имена файлов с сервера с помощью команды get, и сервер быстро отвечает.Пока сервер пишет в сокет, клиенты читают сокет и распечатывают буфер.После этого программа начинает не интерпретировать мои команды, если я не нажму «Enter» дважды. (Вы можете увидеть это из вывода Shell ниже)

После отладки я обнаружил, что это из-за размера буфера.При записи сервера в сокет;все работает правильно, если я использую небольшой размер буфера.Но если я использую больший размер буфера, например 1024, эта проблема возникает.Как я могу избавиться от этой проблемы?

#define F_BUFF_SIZE 1024

На стороне сервера:

/* ... */
if(!strcmp(buffer, "list\n")) {

    char buff[F_BUFF_SIZE];
    bzero(buff, F_BUFF_SIZE);

    pt_ret = pthread_create(&thread_id, NULL, getfiles, (void*) buff);
    pthread_join(thread_id, pt_ret);

    n = write(sock, buff, F_BUFF_SIZE);
/* ... */

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

/* ... */
char buffer[F_BUFF_SIZE];

bzero(buffer, F_BUFF_SIZE);
n = read(b_sock, buffer, F_BUFF_SIZE - 1);

if (n < 0) {
#ifdef _DEBUG_
    fprintf(stderr, "Error: Could not read from the socket.\n");
#endif
    return 0;
}

fputs(buffer, stdout);
/* ... */

Оболочка:

Opening socket: OK!
Connecting: OK!
 # list
client
project1.mk
cs342.workspace
client.c
project1.project
cs342.workspace.session
server
cs342_wsp.mk
server.c
cs342.tags
 # get
 # take
get 
# take
Unknown command.
...

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Нет никакого волшебства в том, чтобы иметь меньший размер буфера, это просто показывает, что у вас есть ошибка в другом месте.Комментарий Йерга - важный момент - вам нужно читать тот же объем данных, который вы пишете.Мне интересно, есть ли проблема с тем, как вы заполняете бафф.Вам нужно убедиться, что вы не переполняете конец буфера или не забыли добавить нулевой терминатор в конец строки.

Кстати, важно прочитать размер - 1;Вы правильно делаете это, так как read не добавляет нулевой терминатор в строку.Вам просто нужно быть уверенным, что вы пишете эту сумму, потому что в противном случае могут возникнуть проблемы.

У вас должны быть некоторые проблемы в этом направлении - это объясняет, почему изменение размера позволяет избежать проблемы, потому что подобные проблемывыставляется только тогда, когда цифры выстраиваются идеально.Запуск программы в valgrind может выявить проблему (ищите ошибки записи).

1 голос
/ 14 марта 2012

@ Ахмет, твой полезный вопрос побудил меня немного исследовать. Если вы немного прочтете на этой статье , у вас будет лучшее представление о том, с чем вы имеете дело, и тогда вы сможете определить наилучший размер буфера в вашей ситуации.

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

Также, вот хорошие советы о том, как определить размер буфера, надеюсь, это поможет,

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