Subject: B20:socket() and fork() bug, look my source.
From: [email-masked] (Kyung-Hwa,Ahn.)

6 Dec 1998 12:43:46 -0800
Message-ID: <[email-masked]>
Mime-Version: 1.0
Content-Type: text/plain; charset=EUC-KR
Content-Transfer-Encoding: 7bit
To: [email-masked]

Hi.
this daemon can't disconnect child socket.
After running this daemon, you can try to connect daemon by telnet.
But, nerver can't disconnect.
Maybe , socket() and fork() related bug.
Of course, other unix os(solaris 2.x, linux 2.x)  disconnect child
socket fd
after connected.

My Com : P-II, Ram 64, Windows 95 korean version.

/* this is simple echo server */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <varargs.h>

int main(argc,argv)
int argc;
char *argv[];
{
  int  sockfd,    /* socket file descripter */
       newsockfd, /* socket file descripter */
       cli_len,   /* for cli_addr */
       childpid,  /* for child process */
       j;         /* for temp */
  char *ip;

  struct sockaddr_in  cli_addr,serv_addr;

  if ( argc!=2 ) {
     printf("Usage : %s #port\n\n",argv[0]);
     exit(0);
  }

  if ( (sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0 )  {
     exit(0);
  }

  bzero( (char *) &serv_addr, sizeof(serv_addr) );
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

  serv_addr.sin_port = htons( atoi(argv[1]) ) ;

  if ( bind(sockfd, (struct sockaddr *) & serv_addr, sizeof(serv_addr))
<0) {
     exit(0);
  }

  listen ( sockfd, 5 );

  while ( 1 ) {

    /* Wait for a connection from a cli_lent process.  */
    cli_len=sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) & cli_addr,
&cli_len);
    if (newsockfd<0) perror("server: accept error");

    /* Make child process */
    if ( (childpid=fork()) <0 ) {
       perror("fork()");
    }
    else if (  childpid==0) {

      /* for child */
      close(sockfd);

      SendtoSocket(newsockfd,"Hello? Why don't you exit?\n");

      exit(0);

    }

    signal(SIGCHLD, SIG_IGN);

    close(newsockfd);
  }

  return(0);
}

int SendtoSocket(sockfd,str)
int sockfd;
char *str;
{
    if ( writen(sockfd,str,strlen(str)) !=strlen(str) )
       perror("str_echo: writen error");
}

int writen(fd,ptr,nbytes)
register int fd;
register char *ptr;
register int nbytes;
{
  int nleft, nwritten;

  nleft=nbytes;
  while ( nleft>0 ) {
    nwritten=write(fd,ptr,nleft);
    if ( nwritten <=0 ) return(nwritten); /* error */

    nleft -= nwritten;
    ptr   += nwritten;
  }

  return (nbytes - nleft);
}

-
For help on using this list (especially unsubscribing), send a message to
"[email-masked]" with one line of text: "help".