2010-01-01 68 views
-1

您好我有我的功能,它負責客戶端和服務器之間聯繫的一個問題:問題以C服務器功能

#define MAX 1024 


void connection(int sock) 
{ 
     char buffer[MAX]; 
     int newsock; 
     int n; 
     int r; 
if(write(sock,"Hello!\n", 6) < 0) 
{ 
     perror("Error: "); 
} 

do { 
     if(write(sock, "\n> ",3) < 0) 
     { 
       perror(" Error: "); 
     } 
memset(buffer,'0',MAX); // fill buffer 

n = read(sock,buffer,MAX -1); 
if (strncmp("get",buffer,3) == 0) 
{ 
     execl("/usr/bin/top","/usr/bin/top","-n 1"); 


} 
else if (strncmp("quit",buffer,4) == 0) 
{ 
     write(sock, "Exit from program\n",17); 
     close(sock); 
} 

else 
{ 
write(sock,"Wrong order!\n", 12); 

} 
} 
while(n); 
} 

當客戶端發送「搞定」這個程序應該把他從「頂」順序查看,不幸的是它在我的程序中不起作用。

其次,請判斷此代碼​​。這是我的第一個服務器程序。我將非常感謝 最後,在發送「獲取」命令後,如何更改功能給客戶在程序中的動作可能性。

問候和新年快樂!

+0

對不起,但很難確定你在問什麼。 例如,「租金」是什麼意思? – bmargulies 2010-01-01 22:41:38

+0

對不起,我是指法官,不是租房。對不起我的英語不好。 – Mateusz 2010-01-01 23:23:49

回答

1

您在不調用fork的情況下調用exec。所以你用頂層副本替換你的整個服務器進程。這是不太可能做你想做的。

很可能,您可以通過從/ proc文件系統打開一個合適的僞文件,讀取信息並將其發送到套接字來實現您的目標。

如果您真的想使用top,您必須使用pipe,fork和exec(l)來運行top,從管道讀取它的輸出,然後將該輸出發送到客戶端。

它發生在我身上,你可能會在服務器自動分叉的環境中運行(如某種類型的CGI網關),在這種情況下,你的問題是你需要fdopen來移動套接字來描述符執行前的#1。如果你想通過編輯你的問題來告訴我們你的環境,那真的很有幫助。

+0

所以襪子應該是一隻襪子[2]? – Mateusz 2010-01-02 16:59:34

0

「top」的輸出發送到服務器的stdout,而不是通過套接字發送到客戶端。你必須調整「頂級」進程的標準輸出才能工作。