abmg@cathedral.cerc.wvu.wvnet.edu (Aliasghar Babadi) (06/04/91)
Hi, I don't know what the problem is with the following code but it can logout any user of DEC5000 macines running X server. I will appreciate if someone can tell me what the problem is. Thanks in advance. /* * The following program is to create connections to X server running on * a given machine * ATTENTION: this will log you out if the machine is Dec5000 running * Ultrix */ /* * includes */ #include <stdio.h> #include <sys/types.h> #include <sys/uio.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <sys/param.h> #include <netinet/in.h> #include <netdb.h> #include <errno.h> /* * defines */ /* * externs */ extern int errno; /* * file scope globals */ static int on = 1 /* used in ioctl */ ; /********************************************************************/ /* connect to a server */ int ConnectToServer(port, server_name) int port; char server_name[]; { int serverfd; struct sockaddr_in sin; struct hostent *hp; char server[MAXHOSTNAMELEN]; strcpy(server, server_name); /* * get a socket */ bzero((char *)&sin, sizeof(sin)); serverfd = socket(AF_INET, SOCK_STREAM, 0); if (serverfd < 0){ perror("ConnectToServer: socket failed"); } if( setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, (char *) NULL, 0) < 0){ perror( "setsockopt failed"); } if( setsockopt(serverfd, SOL_SOCKET, SO_USELOOPBACK,(char *) NULL, 0) < 0){ perror( "setsockopt failed"); } #ifdef SO_DONTLINGER if( setsockopt(serverfd, SOL_SOCKET, SO_DONTLINGER, (char *) NULL, 0) < 0){ perror( "setsockopt failed"); } #endif /* * determine the host machine for this process * if server name is null use the current host name */ if (server[0] == '\0'){ if(gethostname(server, MAXHOSTNAMELEN) < 0 ){ perror( "gethostname failed"); return(-1); } } hp = gethostbyname(server); if (hp == 0){ perror("gethostbyname failed"); return (-1); } sin.sin_family = AF_INET; bcopy((char *)hp->h_addr, (char *)&sin.sin_addr, hp->h_length); sin.sin_port = htons (port); /* * try to connect to Server */ if (connect(serverfd, (struct sockaddr *)&sin, sizeof(sin)) < 0){ switch (errno){ case ECONNREFUSED: /* * may be there is no Server to connect to */ close(serverfd); perror("Can't open connection to Server"); return(-1); default: close(serverfd); perror("Can't open connection to Server"); return(-1); } } return(serverfd); } /******************************************************************/ /* * main routine to test connections to server */ main(argc, argv) int argc; char **argv; { int i; int fd; int port = 6000; /* for X server */ char server_name[MAXHOSTNAMELEN]; int n = 1; /* default is one connection */ strcpy(server_name, ""); /* default name */ if( argc !=3 ){ printf("Usage: server name ntimes\n"); exit(0); } strcpy( server_name, argv[1]); /* internet address(name) of the machine on which X server is running */ n = atoi(argv[2]); /* number of connections */ /* * try to connect to the server more than once */ for (i =0; i < n; i++){ fd = ConnectToServer(port, server_name); printf("---- Connected to %s with fd=%d ----\n",server_name, fd); close(fd); } } /* end */
neideck@kaputt.enet.dec.com (Burkhard Neidecker-Lutz) (06/05/91)
I cannot see any problem with this. I just tested it on my 5000/200 CX running UWS 4.2 with ./logout myhost 300 and it just connected to the server 300 times (which took quite some time. I think there was a bug in 4.0 and 4.1 kernels that you might have triggered with this, it's not in the current release. Burkhard Neidecker-Lutz, Digital CEC Karlsruhe