2014-03-31 66 views
-2

我正在Win32(C++)環境中使用命名管道構建服務器/客戶端聊天應用程序,並且我正在努力尋找更好的解決方案來處理請求的命令客戶端(不是併發問題,也不是同步)。我能想出的唯一辦法是這一個:由服務器處理的客戶端命令C

試想一下,客戶端只能發送幾個命令到服務器,如:

-> Logon arg1 arg2 
-> Register arg1 arg2 
-> Chat_info 
-> Exit 

現在,在服務器端的信息必須是處理,但他怎麼能捕捉到的論據?

我想完成的是與服務器的交互,而不是來自他的簡單回顯響應,例如:作爲客戶端,我會發送:登錄裏卡多pass123 和服務器將檢查用戶名和密碼是有效的。

感謝您的幫助。

+1

也許像'std :: map >'?很難說,因爲它不太清楚你究竟想要完成什麼。 –

+0

因此,服務器會讀取第一個「字符串」,並在函數中使用先前傳遞的其餘參數調用函數? – falkon21

+1

告訴我們你想要完成什麼而不是僞代碼來解決我們不知道或不明白的問題可能更有用。 –

回答

0

Finnaly我找到了一個更好的解決方案,我的問題。那就是:

Server.c

while(1){ 
//... 
printf("[SERVER] Waiting for a client... (ConnectNamedPipe)\n"); 
    if(!ConnectNamedPipe(hPipe, NULL)){ 
     perror("Connection Error!"); 
     //exit(-1); 
    } 
    CreateThread(NULL,0,ListenClient,(LPVOID)hPipe,0,NULL); 
} 

每當一個客戶得到他的命名管道創建,藏漢獲取一個新的線程,並在「ListenClient」功能:

DWORD WINAPI ListenClient(LPVOID param) { ... } 

這將讀取通過管道傳遞的信息,例如:

ret = ReadFile(hPipe, buf, 256,(LPDWORD) &n, NULL); 
if (!ret || !n) 
    perror("Error reading the named pipe!"); 
buf[n] = '\0'; 

將會有與選項一樣多的條件s表示每個客戶端可以從服務器請求,如:

if(strcmp(buf, "Logon")==0) 
{ 
//process the resquest 
} 


if(strcmp(buf, "Register")==0) 
{ 
//process the request 
} 

and so on.. 

這樣,服務器將從緩存中讀取並做了簡單的字符串上發送的第一個參數進行比較。

謝謝大家,我希望它能幫助別人!

相關問題