dial on demand

nikos roussos nikos at hellug.gr
Fri Nov 25 19:38:12 EET 2005


έχω βάλει στον gateway και τρέχει ένα scriptάκι 
που "ακούει" σε μια θύρα.
συνδέομαι με το nc κι όταν γράφω con συνδέεται, ενώ όταν γράφω discon
αποσυνδέεται.

γενικώς δουλεύει εκτός απ' την περίπτωση που ο provider μιλάει (busy tone) τότε
μόλις γράφω discon αποσυνδέται μεν, αλλά "πέφτει" και το πρόγραμμα κι έτσι δεν
μπορώ να ξανασυνδεθώ με το nc.

καμιά ιδέα γιατι συμβαίνεια αυτό;

το πρόγραμμα (έχω κόψει τα include):

#define BUFSIZE 1024

void signal_child(int signo);

int main(void) {
  pid_t child_pid;
  int sock_fd, sock_in;
  struct sockaddr_in sock_srv;
  socklen_t sock_len;
  int srv_port=9999;
  int data_len;
  char buf[BUFSIZE];

  if((sock_fd=socket(PF_INET, SOCK_STREAM, 0))<0)
    perror("Error: socket");

  memset(&sock_srv, 0, sizeof(sock_srv));
  sock_srv.sin_family=AF_INET;
  sock_srv.sin_port=htons(srv_port);

  sock_len=sizeof(sock_srv);
  if((bind(sock_fd, (struct sockaddr *)&sock_srv, sock_len))<0)
    perror("Error: bind");

  if((listen(sock_fd, 5)) < 0)
    perror("Error, listen");

  signal(SIGCHLD, signal_child);

  while(1) {
    if((sock_in=accept(sock_fd, (struct sockaddr *)&sock_srv, &sock_len))<0)
      perror("Error: accept");

    if((child_pid=fork())==0) {
      close(sock_fd);
      while((data_len=read(sock_in, buf, sizeof(buf)))>0) {
	if (strspn(buf, "con")>2)
	  system("ppp-go");
	if(strspn(buf, "discon")>5)
	  system("eznet down");
      }
      exit(0);
    }
    close(sock_in);
  }
  exit(0);
}

void signal_child(int signo) {
  pid_t pid;
  int stat;

  while((pid=waitpid(-1, &stat, WNOHANG))>0);
  return;
}


-------
A city is a large community where people are lonesome together
		-- Herbert Prochnow




More information about the Linux-greek-users mailing list