Программирование Unix Networking - Клиент и Сервер.Функция List, которая ожидает ввода после 40 строк - PullRequest
0 голосов
/ 07 сентября 2011

Я сейчас нахожусь в процессе создания Клиента и Сервера в среде Unix / Windows, но сейчас я просто работаю на стороне Unix. Одна из функций, которую мы должны создать для программы, похожа на функцию списка в Unix, которая показывает все файлы в директории, но мы также должны показать дополнительную информацию о файле, такую ​​как его владелец и дата создания. Прямо сейчас я могу получить всю эту информацию и распечатать ее клиенту, однако мы должны также добавить, что после того, как программа напечатает 40 строк, она ждет, пока клиент нажмет любую клавишу, прежде чем продолжить печать.

Мне нужна программа, чтобы сделать это, но это приведет к тому, что мой клиент и сервер выйдут из синхронизации или, по крайней мере, выйдет из синхронизации. Это означает, что если я ввожу команду «asdad», она должна напечатать недопустимую команду, но не напечатает это сообщение, пока не введу другую команду. Я добавил свой список функций кода ниже. Я открыт для предложений о том, как выполнить это требование, поскольку выбранный мною метод, похоже, не работает.

Заранее спасибо.

Сервер - Fork Function: вызывается при вводе команды list. например,

fork_request(newsockfd, "list", buf);

int fork_request(int fd, char req[], char buf[])
{

#ifndef WIN

int pid = fork();
if (pid ==-1) 
{
    printf("Failed To Fork...\n");
    return-1;
}
if (pid !=0)
{
    wait(NULL);
    return 10;
}
dup2(fd,1); //redirect standard output to the clients std output.
close(fd); //close the socket
execl(req, req, buf, NULL); //run the program
exit(1);

#else
#endif

}

Вот функция, используемая для получения всей информации о файле в директории

void longOutput(char str[])
{
    char cwd[1024];
    DIR *dip;
    struct dirent *dit;
    int total;
    char temp[100];
    struct stat FileAttrib;
    struct tm *pTm;
    int fileSize;
    int lineTotal;


if(strcmp(str, "") == 0)
{
    getcwd(cwd, sizeof(cwd));
}
else
{
    strcpy (cwd, str);
}

if (cwd != NULL)
{
    printf("\n Using Dir: %s\n", cwd);
    dip = opendir(cwd);

    if(dip != NULL)
    {
        while ((dit = readdir(dip)) != NULL)
        {
            printf("\n%s",dit->d_name);
            stat(dit->d_name, &FileAttrib);
            pTm = gmtime(&FileAttrib.st_ctime);
            fileSize = FileAttrib.st_size;
            printf("\nFile Size: %d Bytes", fileSize);
            printf("\nFile created on: %.2i/%.2i/%.2i at %.2i:%.2i:%.2i GMT \n", (pTm->tm_mon + 1), pTm->tm_mday,(pTm->tm_year % 100),pTm->tm_hour,pTm->tm_min, pTm->tm_sec);;
            lineTotal = lineTotal + 4;

            if(lineTotal == 40)
            {
                printf("40 Lines: Waiting For Input!");
                fflush(stdout);
                gets(&temp);
            }


        }
        printf("\n %d \n", lineTotal);
    }
    else
    {
        perror ("");
    }
}
}

Здесь есть раздел клиента, где я проверяю это! не был найден в возвращенном сообщении. Если это так, значит, было напечатано больше строк.

if(strchr(command,'!') != NULL)
{
    char temp[1000];
    gets(&temp);

}

Извините за длинный пост, но если вам что-то нужно, просто спросите.

1 Ответ

0 голосов
/ 07 сентября 2011

Хотя я не видел никакого кода TCP / IP, у меня когда-то была похожая проблема, когда я писал чат-программу сервер-клиент на C ++. В моем случае проблема заключалась в том, что я не мог четко определить, как сообщения были структурированы в моем приложении. Однажды я определил, как должен работать мой протокол - было намного проще отлаживать проблемы со связью.

Возможно, вам следует проверить, как ваша программа определяет, завершено ли сообщение. В TCP пакеты гарантированно доставляются в порядке без потери данных и т. Д. Очень похоже на разговор по телефону. Единственное, с чем вам следует быть осторожным, это то, что можно частично получить сообщение, когда вы читаете буфер для сокета. Единственный способ остановить чтение - это определить, что сообщение завершено. Это может быть просто два символа '\ n' или "\ n \ r".

Если вы используете UDP, то это совершенно другой зверь все вместе (то есть сообщения могут поступать не по порядку и могут быть потеряны при передаче, и так далее).

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

...