Есть прога которая слушает порт и при запросе на соединение создаёт свою копию и запускает процедуру работы с клиентом. Ну вообщем стандартный демон с fork.работает номально но иногда вылетает порт остаётся занятым. т.е. даже её перезапустить нельзя выдаёт bind error. Только перезапуск сервера помогает.
хочется знать:
1. Что в коде неправильного что прога вылетает?
2. А как можно освободить порт для bind?
Вот исходник:
int main(){
pid_t pid;
openlog("stargate",LOG_PID,LOG_USER); //otkruli soedinenie s logerom
syslog(LOG_INFO,"Start stargate"); //proizohel start
read_init();
server();
}
server(){
pid_t pid_;
int sid, newsid;
size_t sin_size = sizeof(struct sockaddr_in);
sid=socket(AF_INET, SOCK_STREAM, 0); //sozdaem soket
if(sid==-1){
syslog(LOG_ERR,"Socket create error");
closelog();
exit(1);
}
bzero(&(localAddr), sizeof(localAddr)); //obnulyaem strukturu
localAddr.sin_family=AF_INET; //rabotaem s tcp/ip
localAddr.sin_port=htons(SERVER_PORT); //po portu "SERVER_PORT"
localAddr.sin_addr.s_addr=INADDR_ANY; //na lubom ip adrese
if(bind(sid, (struct sockaddr *)&localAddr, sin_size)==-1){
syslog(LOG_ERR,"Bind error");
closelog();
exit(1);
}
if(listen(sid, 5)==-1){ //sluhaem interfeys, ochered - 5 zaprosov
syslog(LOG_ERR,"Listen error");
closelog();
exit(1);
}
while(1){
while( (pid_ = waitpid(-1,0,WNOHANG)) > 0 )
;
newsid=accept(sid, (struct sockaddr *)&remoteAddr, &sin_size); //ystanovleno novoe soedinenie
if(newsid==-1){
syslog(LOG_ERR,"Accept error");
closelog();
exit(1);
}
if (!fork()){ //sozdaem novuy eksemplyar dla obrabotki novogo soedineniya
syslog(LOG_INFO,"Got a connection from %s",inet_ntoa(remoteAddr.sin_addr));
close(sid); //zakruvaem roditelskiy soket
talker(newsid, remoteAddr); //perehodim v glavnuy programu kotoraya buded obchatsys s abonentom
close(newsid);
syslog(LOG_INFO,"Close connection from %s",inet_ntoa(remoteAddr.sin_addr));
closelog();
exit(0);
}
}
}