我在C上的UNIX上編寫程序,我必須在套接字上編寫客戶端 - 服務器(TCP)程序。客戶端發送一些信息和服務器答案。不管客戶端發送或接收的是什麼,因爲我成功地爲它寫了代碼。但是任務的最後部分對我來說非常困難。進程的動態池C
1)一個連接 - 一個子進程。
2)對於使用運行前處理從池中的新連接。
3)池的大小是dinamic.If(不服務客戶)免費進程的數量大於N變得不那麼 - 應創建新的進程,如果它於K變得更加 - 「額外」的進程必須被終止。
這是我的代碼。每個連接都使用fork()
進行新的子進程。每個連接都以新進程運行。但是如何製作我上面所說的動態池呢?
請幫忙,這非常重要!這是我應該做的最後一件事。
服務器代碼:
int main(int argc, char * argv[])
{
int cfd;
int listener = socket(AF_INET, SOCK_STREAM, 0); //create listiner socket
if(listener < 0){
perror("socket error");
return 1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
int binding = bind(listener, (struct sockaddr *)&addr, sizeof(addr));
if(binding < 0){
perror("binding error");
return 1;
}
listen(listener, 1); //listen for new clients
signal(SIGCHLD,handler);
int pid;
for(;;) // infinity loop on server
{
cfd = accept(listener, NULL, NULL); //client socket descriptor
pid = fork(); //make child proc
if(pid == 0) //in child proc...
{
close(listener); //close listener socket descriptor
... //some server actions that I do.(receive or send)
close(cfd); // close client fd
return 0;
}
close(cfd);
}
return 0;
}
所以,你需要父和池中的孩子之間的某種IPC。你有什麼指導什麼IPC機制使用? 'socketpair'也許? – hyde 2013-04-28 20:57:15
我昨天讀過這本書,意在回到它。這比普通的學生項目要複雜一些。 – Duck 2013-04-29 20:20:38