我目前正在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,那么这是一个完全不同的兽在一起(即消息可以无序到达,可以在传输中丢失,等等)。
而且,看起来你是在发送字符串而不是二进制数据。如果是这种情况,那么您就不必担心尾序。