[英]How to daemonize a process in C using fork() func. - socket programming
[英]Socket programming C, change fork() to select()
我是一名學生,我正在使用 TCP 協議在 C 中做一個客戶端/服務器項目。
服務器必須同時處理多個客戶端,我想實現 select() function 而不是 fork(),但我有點掙扎。 你有什么建議嗎?
謝謝!
客戶:
...
if(connect(sock_client, (struct sockaddr*)&addr_server, sizeof(addr_server)) < 0){
perror("Error in connection:\n");
exit(1);
}
printf("Connected to MyServer.\n");
while(true){
printf("Client: \t");
memset(bufferData.attractionName, 0, strlen(bufferData.attractionName)); // clear buffer
scanf("%[^\n]%*c", bufferData.attractionName); // get all words, not only the first
send(sock_client, bufferData.attractionName, strlen(bufferData.attractionName), 0);
if(strcmp(bufferData.attractionName, "!exit") == 0) {
close(sock_client);
printf("Disconnected from server.\n");
exit(1);
}
if(recv(sock_client, bufferData.attractionName, MAX, 0) < 0) printf("Error in receiving data.\n");
else printf("Server: \t%s\n", bufferData.attractionName);
}
...
服務器:
while(true) {
newSocket = accept(sockfd, (struct sockaddr*)&addr_new, &addr_size);
if(newSocket < 0) exit(1);
printf("/!\\ New Client connected (%s:%d)\n", inet_ntoa(addr_new.sin_addr), ntohs(addr_new.sin_port));
/*
Switch from fork to select here !
*/
if((child_pid = fork()) == 0) {
close(sockfd);
while(true) {
recv(newSocket, bufferData.attractionName, MAX, 0);
printf("Client message : %s\n", bufferData.attractionName);
strncpy(bufferData.attractionName, "Received\n", MAX);
send(newSocket, bufferData.attractionName, strlen(bufferData.attractionName), 0);
bzero(bufferData.attractionName, sizeof(bufferData.attractionName));
}
}
}
當您使用多個分叉的進程時,每個進程都在其特定的套接字上等待消息,您通常會阻塞read()
。
當您使用單個進程時,通常會阻塞select()
在偽代碼中:
for (number of sockets) {
open (socket)
fork()
// dedicated process here
wait (for something to read on that socket)
read(message from that socket) // blocking read
process message
}
在一個進程中完成所有操作意味着您必須在select()
中等待:
for (number of sockets) {
open (socket)
add socket to select set
}
do {
select (on select set) // wait for anything on all sockets
identify socket to read from
read message from that socket (should never block)
process message
} done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.