I write a socket program and run it at 192.168.6.19 .The machine of 192.168.1.10 run winXP.
After runnning server,telnet it and get the message.But close the telnet,processes are CLOSE_WAIT.
netstat results:
local address forein address state PID/Program
0 *:6666 *:* LISTEN 21432/server
192.168.6.19:6666 192.168.1.10:1046 CLOSE_WAIT 21432/server
192.168.6.19:6666 192.168.6.19:2687 CLOSE_WAIT 21432/server
192.168.6.19:6666 192.168.1.10:1069 CLOSE_WAIT 21432/server
What they have the same PID?
//server.c
Code:
===================================================
#include "head.h"
void sig_chld(int signo){
pid_t pid;
int stat;
pid=wait(&stat);
printf ("child process %d has terminate\n",pid);
return;
//end sig_chld;
}
int main(){
pid_t childpid;
int listenfd,connfd;
socklen_t childlen;
struct sockaddr_in servaddr,clientaddr;
listenfd=Socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(PORT);
Bind(listenfd,(SA*)& servaddr,sizeof(servaddr));
Listen(listenfd,(SA*)&servaddr,LISTENQ);
signal(SIGCHLD,sig_chld);
for(1){
childlen=sizeof(clientaddr);
connfd=Accept(listenfd,(SA*)&clientaddr,&childlen);
if((childpid=fork())==0){ /*Child process*/
close(listenfd); /*Close listen socket*/
/*
process the request.
*/
writen(connfd,"Hello,world\n",sizeof("Hello,world\n"));
close (connfd);
exit(0);
}
close (childpid); //Parent process:close connected socket
}
return 0;
}
===================================================
If delete
signal(SIGCHLD,sig_chld);
then the children processes will become zombie.