Programming Assignment #1

Problem Description:

Write two separate programs for such a client-server model: the client reads a UNIX command from keyboard, writes it to the IPC channel, reads the command execution result and displays it on screen. The server reads the command from the IPC channel, executes it, and writes the execution result to the IPC channel. The whole procedure is shown as follows:

UNIX网络编程第一次作业基本搞定
To run your program, please first start the server process in the background like server& and then run the client in the foreground since the client reads from the standard input and writes to the standard output. Alternatively you can open 2 terminal windows respectively for the server and the client.

Requirements:

1)  You need to use 2 FIFOs to implement the IPC channels since the client and the server run in two unrelated processes.

2)  The server may use popen() to execute a UNIX command and get the execution result. Pls pay special attention to the command “cd”.

3)       Your program should be able to handle errors. For example, if the client sends an illegal Unix command, the server will return the Unix original error message. The client then displays the error message. 

4)       Send your assignment to the corresponding TA’s email account.

5)       Late submission is not accepted.

      

      先贴到BLOG上
      只是作业要求有点不是非常明白
      CD命令执行没有得出结果,原因上课的时候好像也讲了,但是要求我们程序中进行什么处理呢?
      不解啊。。。。

附源程序:

header.h

UNIX网络编程第一次作业基本搞定# include  < stdio.h >
UNIX网络编程第一次作业基本搞定# include 
< sys / types.h >
UNIX网络编程第一次作业基本搞定# include 
< sys / stat.h >
UNIX网络编程第一次作业基本搞定# include 
< fcntl.h >
UNIX网络编程第一次作业基本搞定# include 
" unistd.h "
UNIX网络编程第一次作业基本搞定# include 
< string .h >
UNIX网络编程第一次作业基本搞定# include 
< limits.h >
UNIX网络编程第一次作业基本搞定
UNIX网络编程第一次作业基本搞定
#define  PUBLIC "/tmp/PUBLIC"
UNIX网络编程第一次作业基本搞定
#define  B_SIZ ( PIPE_BUF/2 )
UNIX网络编程第一次作业基本搞定
struct  Message
UNIX网络编程第一次作业基本搞定 {
UNIX网络编程第一次作业基本搞定    
char  fifo_name[B_SIZ];
UNIX网络编程第一次作业基本搞定    
char  cmd_line[B_SIZ];
UNIX网络编程第一次作业基本搞定}
;
UNIX网络编程第一次作业基本搞定

server.c

UNIX网络编程第一次作业基本搞定# include  " header.h "
UNIX网络编程第一次作业基本搞定main(
void )
UNIX网络编程第一次作业基本搞定 {
UNIX网络编程第一次作业基本搞定    
int  n,done,dummyfifo,publicfifo,privatefifo;
UNIX网络编程第一次作业基本搞定    
struct  Message msg;
UNIX网络编程第一次作业基本搞定    FILE 
*  fin;
UNIX网络编程第一次作业基本搞定    
static   char  buffer[PIPE_BUF];
    
/**/ /* 生成公共FIFO  */
UNIX网络编程第一次作业基本搞定    mknod  ( PUBLIC, S_IFIFO
| 0666 0  );
    
/**/ /* 打开公共FIFO读写  */
UNIX网络编程第一次作业基本搞定    
if  ( ( publicfifo  =  open (PUBLIC,O_RDONLY) ) ==- 1   ||
UNIX网络编程第一次作业基本搞定        ( dummyfifo 
==  open (PUBLIC,O_WRONLY | O_NDELAY) ) ==- 1  )
    
UNIX网络编程第一次作业基本搞定 {
UNIX网络编程第一次作业基本搞定        perror(PUBLIC);
UNIX网络编程第一次作业基本搞定        exit(
1 );
UNIX网络编程第一次作业基本搞定    }

UNIX网络编程第一次作业基本搞定    printf(
" Server has been startedUNIX网络编程第一次作业基本搞定\n PUBLIC FIFO:%s\n " ,PUBLIC);
    
/**/ /*  从公共FIFO读取 */
UNIX网络编程第一次作业基本搞定    
while  ( read( publicfifo, ( char * ) & msg, sizeof (msg)) > 0  )
    
UNIX网络编程第一次作业基本搞定 {
UNIX网络编程第一次作业基本搞定        n
= done = 0 ;
        
do UNIX网络编程第一次作业基本搞定
            
/**/ /* 打开client私有FIFO----sleep参考某本书上的做法,书名记不清楚了 */
UNIX网络编程第一次作业基本搞定          
if ( (privatefifo  =  open(msg.fifo_name,O_WRONLY | O_NDELAY)) ==- 1 )
UNIX网络编程第一次作业基本搞定            sleep(
3 );
UNIX网络编程第一次作业基本搞定          
else
          
UNIX网络编程第一次作业基本搞定 {
           fin 
=  popen(msg.cmd_line, " r " );  /**/ /* 执行客户端的命令  */
UNIX网络编程第一次作业基本搞定           write ( privatefifo , 
" \n "  ,  1  );
UNIX网络编程第一次作业基本搞定           
while ( (n  =  read (fileno(fin),buffer,PIPE_BUF) ) > 0 )
           
UNIX网络编程第一次作业基本搞定 {
                write(privatefifo,buffer,n); 
/**/ /* write to private fifo */
                memset(buffer,
0x0 ,PIPE_BUF);  /**/ /* empty the buffer */
UNIX网络编程第一次作业基本搞定           }

UNIX网络编程第一次作业基本搞定           pclose(fin);
UNIX网络编程第一次作业基本搞定           close(privatefifo);    
UNIX网络编程第一次作业基本搞定           done 
=   1 ;
UNIX网络编程第一次作业基本搞定          }
    
UNIX网络编程第一次作业基本搞定        }
while ( ++ n < 5   &&   ! done);
        
if (done  ==   0 /**/ /*  fail */
UNIX网络编程第一次作业基本搞定         write(fileno(stderr),
" \n NOTE:Server never accessed private FIFO \n " , 481 );
UNIX网络编程第一次作业基本搞定    }

UNIX网络编程第一次作业基本搞定}

UNIX网络编程第一次作业基本搞定

client.c

UNIX网络编程第一次作业基本搞定# include  " header.h "
UNIX网络编程第一次作业基本搞定
int  main( void UNIX网络编程第一次作业基本搞定 {
UNIX网络编程第一次作业基本搞定    
int  n,privatefifo,publicfifo;
UNIX网络编程第一次作业基本搞定    
static   char  buffer[PIPE_BUF];
UNIX网络编程第一次作业基本搞定    
struct  Message msg;
    
/**/ /* 生成私有FIFO的名称  */     
UNIX网络编程第一次作业基本搞定    sprintf( msg.fifo_name, 
" /tmp/fifo%d "  , getpid()); // 送格式化输出到字符串中 
      /**/ /* 生成私有FIFO  */
UNIX网络编程第一次作业基本搞定     
if ( mknod( msg.fifo_name, S_IFIFO | 0666  ,  0 ) < 0  )
     
UNIX网络编程第一次作业基本搞定 {
UNIX网络编程第一次作业基本搞定         perror(msg.fifo_name);    
// 系统错误信息    
UNIX网络编程第一次作业基本搞定
         exit( 1 );
UNIX网络编程第一次作业基本搞定     }

     
/**/ /* open public FIFO to write  */
UNIX网络编程第一次作业基本搞定     
if ( (publicfifo  =  open(PUBLIC,O_WRONLY)) ==- 1 ) // 打开一个文件用于读或写 
      UNIX网络编程第一次作业基本搞定 {
UNIX网络编程第一次作业基本搞定         perror(PUBLIC);
UNIX网络编程第一次作业基本搞定         exit(
2 );
UNIX网络编程第一次作业基本搞定     }
 
UNIX网络编程第一次作业基本搞定     
while ( 1 )
     
UNIX网络编程第一次作业基本搞定 {
UNIX网络编程第一次作业基本搞定
UNIX网络编程第一次作业基本搞定          write(fileno(stdout),
" \n send client cmd> " , 18 );  // 将提示信息写到标准输出
UNIX网络编程第一次作业基本搞定
          memset(msg.cmd_line, 0x0 ,B_SIZ);  // 清除命令
UNIX网络编程第一次作业基本搞定
          n  =  read(fileno(stdin),msg.cmd_line,B_SIZ);  // 从输入读入命令到msg.cmd_line
UNIX网络编程第一次作业基本搞定
           if ( ! strncmp( " quit " ,msg.cmd_line,n - 1 ))  // 是否退出
UNIX网络编程第一次作业基本搞定
            break ;
UNIX网络编程第一次作业基本搞定          write(publicfifo,(
char * ) & msg, sizeof (msg));  // 将命令写入到公共FIFO
UNIX网络编程第一次作业基本搞定
UNIX网络编程第一次作业基本搞定          
UNIX网络编程第一次作业基本搞定          
// 打开私有FIFO
UNIX网络编程第一次作业基本搞定
           if ((privatefifo  =  open(msg.fifo_name,O_RDONLY)) ==- 1 )
          
UNIX网络编程第一次作业基本搞定 {
UNIX网络编程第一次作业基本搞定              perror(msg.fifo_name);
UNIX网络编程第一次作业基本搞定              exit(
3 );
UNIX网络编程第一次作业基本搞定          }

UNIX网络编程第一次作业基本搞定
UNIX网络编程第一次作业基本搞定          
// 读取私有FIFO的消息到buffer,然后输出buffer
UNIX网络编程第一次作业基本搞定
           while ( (n = read(privatefifo,buffer,PIPE_BUF)) > 0  )
          
UNIX网络编程第一次作业基本搞定 {
UNIX网络编程第一次作业基本搞定              write(fileno(stderr),buffer,n);
UNIX网络编程第一次作业基本搞定          }

UNIX网络编程第一次作业基本搞定          close(privatefifo);
UNIX网络编程第一次作业基本搞定    }

UNIX网络编程第一次作业基本搞定    close(publicfifo);
UNIX网络编程第一次作业基本搞定    unlink(msg.fifo_name);
// delete
UNIX网络编程第一次作业基本搞定
}

UNIX网络编程第一次作业基本搞定


      

相关文章:

猜你喜欢
  • 2022-12-23
  • 2021-06-22
  • 2021-12-24
  • 2022-12-23
  • 2021-09-29
  • 2021-04-03
  • 2021-12-02
相关资源
相似解决方案