Unix网络编程-客户端和服务器.列表函数,在40行之后等待输入



我目前正在Unix/Windows环境下制作客户端和服务器,但现在我只是在Unix方面工作。我们必须为程序创建的一个函数类似于Unix中的列表函数,它显示目录中的所有文件,但我们还必须显示有关文件的更多信息,例如其所有者和创建日期。现在我能够获得所有这些信息并将其打印到客户端,但是我们还必须添加,一旦程序打印了40行,它将等待客户端在继续打印之前按下任何键。

我必须让程序这样做,但它会导致我的客户端和服务器不同步,或者至少是std out不同步。这意味着如果我输入命令"asdad",它应该打印无效的命令,但它不会打印该消息,直到我输入另一个命令。我在下面添加了列表函数代码。我对如何完成这一要求的建议持开放态度,因为我选择的方法似乎并没有奏效。

提前谢谢你。

Server - Fork函数:当输入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: %sn", 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 ("");
    }
}
}

在这里是客户端的部分,我检查a !未在返回的消息中找到。如果有,则表示有更多行要打印。

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

很抱歉长帖子,但如果你需要什么,请只是问。

虽然我没有看到任何TCP/IP代码,但我曾经在用c++编写服务器-客户端聊天程序时遇到过类似的问题。在我的例子中,问题在于我没有清楚地定义消息在我的应用程序中是如何结构化的。一旦我定义了我的协议应该如何工作——调试通信问题就容易多了。

也许你应该检查一下你的程序是如何判断消息是否完整的。在TCP中,数据包保证按顺序到达,没有数据丢失等。很像电话里的对话。唯一需要注意的是,当您读取套接字缓冲区时,可能会接收到部分消息。您知道停止阅读的唯一方法是当您确定消息已完成时。这可以像两个'n'字符或"nr"一样简单。

如果你使用UDP,那么这是一个完全不同的兽在一起(即消息可以无序到达,可以在传输中丢失,等等)。

而且,看起来你是在发送字符串而不是二进制数据。如果是这种情况,那么您就不必担心尾序。

最新更新