C - 重定向不起作用

时间:2016-01-08 21:20:41

标签: redirect client-server dup2 execl

我正在尝试将另一个程序的输出重定向到套接字, 我尝试过dup2(STDOUT_FILE,socketfd);服务器源代码中的execl(“/ bin / ls”,“ls”,(char *)0)和客户端源代码中的read(socketfd,buff,1)..但客户端的输出似乎只是一个空字符串..

int main(){
struct sockaddr_in my_addr;

my_addr.sin_family = AF_INET;
my_addr.sin_port  = htons(5200);
my_addr.sin_addr.s_addr= htonl (INADDR_ANY);    

int fd1, fd2;

fd1=socket (PF_INET, SOCK_STREAM, 0);
bind (fd1, (struct sockaddr *) &my_addr, sizeof(my_addr));

listen (fd1, 5);

while (1){
fd2= accept (fd1, NULL,NULL);
char *stringa,*mex;
int lenght; 
struct stat buf;
   mex=(char*)malloc(sizeof(int)+1);    
       read (fd2,&lenght,sizeof(int));  
       stringa=(char*)malloc(sizeof(char)*lenght);  
   read(fd2,stringa,lenght);

   write (1,"\n",1); 
if (lstat(stringa, &buf)<0){

    sprintf(mex,"%d",-1);       
    write (fd2,mex,sizeof(int));

    }   
else if (S_ISDIR(buf.st_mode)){
    DIR* direct= opendir(stringa);
    struct dirent *directory;
    int howmany=0;  
    while((directory=readdir(direct))!=NULL){
        lstat(directory->d_name,&buf);
        if (S_ISREG(buf.st_mode))
            howmany++;
        }

    sprintf(mex,"%d",howmany);      
    write (fd2,mex,sizeof(int));

}else if (buf.st_mode & S_IXUSR){
    dup2(STDOUT_FILENO, fd2);       
    execl("/bin/ls","ls",(char*)0);
    }           
write (fd2,"$",1);  

 }  
}`

1 个答案:

答案 0 :(得分:0)

嗯,这有点乱 - 就在我头顶:

  1. 为了安全起见,此my_addr应该在此之前归零: my_addr.sin_family = AF_INET
  2. 检查系统调用的返回!!
  3. 投射malloc的回报不是一个好主意:mex=(char*)malloc(sizeof(int)+1);
  4. 我希望这个长度包含'\ 0'字节:read (fd2,&lenght,sizeof(int));
  5. 如果stringa未终止,则会遇到麻烦:lstat(stringa, &buf)
  6. 你意识到这会结束你的程序,对: execl("/bin/ls","ls",(char*)0);
  7. 我确信还有更多...