Exemplo n.º 1
0
/*
** @brief change port when we can't listen
**
** @param s our server's structure
** @param i our current port
** @param sck the socket
** @param j a port
**
** @return -1 if we reached our MAX_PORT or 0
*/
static int	_change_port(t_server *s, int i, int sck, int j)
{
  t_sockaddr_in	sin;

  sin.sin_family = AF_INET;
  sin.sin_port = htons(s->ports[i]);
  sin.sin_addr.s_addr = INADDR_ANY;
  if (s->ports[i] <= 1023)
    {
      nbr_log("port to low (1 - 1023 not allowed) :", s->ports[i],
	      "_change_port", TYPE_ERROR);
      s->ports[i] = 1024;
    }
  while (s->ports[i] < MAX_PORT && my_bind(sck, (const t_sockaddr *)&sin,
					   sizeof(sin), s->ports[i]) == -1)
    {
      ++s->ports[i];
      sin.sin_port = htons(s->ports[i]);
    }
  while (s->ports[j] != -1)
    {
      s->ports[j] = s->ports[j - 1];
      ++j;
    }
  return (s->ports[i] == MAX_PORT ? -1 : 0);
}
Exemplo n.º 2
0
static void
listen_connect_drop(void)
{
	struct sockaddr_in sin;
	int slisten, sconnect, sv[2];
	int inflight, openfiles;
	socklen_t len;

	test = "listen_connect_drop";
	printf("%s\n", test);
	save_sysctls(&inflight, &openfiles);

	slisten = my_socket(PF_INET, SOCK_STREAM, 0);
	my_bind(slisten, (struct sockaddr *)&sin, sizeof(sin));
	my_listen(slisten, -1);

	my_socketpair(sv);

	len = sizeof(sin);
	my_getsockname(slisten, (struct sockaddr *)&sin, &len);

	sconnect = my_socket(PF_INET, SOCK_STREAM, 0);
	setnonblock(sconnect);
	my_connect(sconnect, (struct sockaddr *)&sin, len);

	sleep(1);
	sendfd(sv[0], slisten);
	close3(slisten, sv[0], sv[1]);
	sleep(1);
	close(sconnect);

	test_sysctls(inflight, openfiles);
}
Exemplo n.º 3
0
/*
 * Listen sockets can also be passed over UNIX domain sockets, so test
 * various cases, including ones where listen sockets have waiting sockets
 * hanging off them...
 */
static void
listen_nothing(void)
{
	struct sockaddr_un sun;
	struct sockaddr_in sin;
	int inflight, openfiles;
	int s;

	test = "listen_nothing_unp";
	printf("%s\n", test);
	bzero(&sun, sizeof(sun));
	sun.sun_family = AF_LOCAL;
	sun.sun_len = sizeof(sun);
	snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/%s", dpath, test);
	save_sysctls(&inflight, &openfiles);
	s = my_socket(PF_LOCAL, SOCK_STREAM, 0);
	my_bind(s, (struct sockaddr *)&sun, sizeof(sun));
	my_listen(s, -1);
	close(s);
	(void)unlink(sun.sun_path);
	test_sysctls(inflight, openfiles);

	test = "listen_nothing_inet";
	printf("%s\n", test);
	bzero(&sin, sizeof(sin));
	sin.sin_family = AF_INET;
	sin.sin_len = sizeof(sin);
	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
	sin.sin_port = htons(0);
	save_sysctls(&inflight, &openfiles);
	s = my_socket(PF_INET, SOCK_STREAM, 0);
	my_bind(s, (struct sockaddr *)&sin, sizeof(sin));
	my_listen(s, -1);
	close(s);
	test_sysctls(inflight, openfiles);
}
Exemplo n.º 4
0
int main(int argc, char **argv)
{
    int     listenfd = 0;
    int     connfd = 0;
    pid_t   childpid ;
    socklen_t   clilen;
    struct  sockaddr_in     cliaddr;
    struct  sockaddr_in     servaddr;

    listenfd = my_socket(AF_INET, SOCK_STREAM, 0);
	
	signal(SIGCHLD, tu5_11sig_chld);						///
	
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);

    my_bind(listenfd, (SA *)&servaddr, sizeof(servaddr));
    my_listen(listenfd, LISTENQ);

    while(1)
    {
        clilen = sizeof(cliaddr);
        if ( (connfd = my_accept(listenfd, (SA*)&cliaddr, &clilen)) < 0)
        {
        
        }

        if ((childpid = my_fork()) == 0)
        {
            my_close(listenfd);
            tu5_17str_echo(connfd);
            exit(0);
        }
        my_close(connfd);
    }

    return 0;
}
Exemplo n.º 5
0
int main(int argc, const char *argv[])
{
    int listenfd, connfd;
    struct sockaddr_in servaddr, cliaddr;
    socklen_t cliaddr_len;
    char buf[MAXLINE];
    char str[INET_ADDRSTRLEN];
    int n, i;
    pid_t pid;

    listenfd = my_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(SERV_PORT);

    my_bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    my_listen(listenfd, 20);

    printf("Accepting connections...\n");

    while (1) 
    {
        cliaddr_len = sizeof(cliaddr);
        connfd = my_accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);

        pid = fork();
        if (pid == -1) 
        {
            perror("call to fork");
            exit(1);
        }
        else if (pid == 0) 
        {
            my_close(listenfd);
            while (1) 
            {
                n = my_read(connfd, buf, MAXLINE);
                if (n == 0)
                {
                    printf("The other side has been closed.\n");
                    break;
                }
                printf("Received from %s at PORT %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));

                for (i = 0; i < n; i++) 
                {
                    buf[i] = toupper(buf[i]);
                }
                my_write(connfd, buf, n);
            }
            my_close(connfd);
            exit(0);
        }
        else 
        {
            my_close(connfd);
        }
    }

    return 0;
}
Exemplo n.º 6
0
/*
 * Send a listen UDP socket over a UNIX domain socket.
 *
 * Send a listen TCP socket over a UNIX domain socket.
 *
 * Do each twice, with closing of the listen socket vs. socketpair in
 * different orders.
 */
static void
listen_drop(void)
{
	struct sockaddr_un sun;
	struct sockaddr_in sin;
	int inflight, openfiles;
	int s, sv[2];

	bzero(&sun, sizeof(sun));
	sun.sun_family = AF_LOCAL;
	sun.sun_len = sizeof(sun);

	/*
	 * Close listen socket first.
	 */
	test = "listen_drop_unp1";
	printf("%s\n", test);
	snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/%s", dpath, test);
	save_sysctls(&inflight, &openfiles);
	s = my_socket(PF_LOCAL, SOCK_STREAM, 0);
	my_bind(s, (struct sockaddr *)&sun, sizeof(sun));
	my_listen(s, -1);
	my_socketpair(sv);
	sendfd(sv[0], s);
	close3(s, sv[0], sv[1]);
	test_sysctls(inflight, openfiles);

	/*
	 * Close socketpair first.
	 */
	test = "listen_drop_unp2";
	printf("%s\n", test);
	snprintf(sun.sun_path, sizeof(sun.sun_path), "%s/%s", dpath, test);
	save_sysctls(&inflight, &openfiles);
	s = my_socket(PF_LOCAL, SOCK_STREAM, 0);
	my_bind(s, (struct sockaddr *)&sun, sizeof(sun));
	my_listen(s, -1);
	my_socketpair(sv);
	sendfd(sv[0], s);
	close3(sv[0], sv[1], s);
	test_sysctls(inflight, openfiles);

	sin.sin_family = AF_INET;
	sin.sin_len = sizeof(sin);
	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
	sin.sin_port = htons(0);

	/*
	 * Close listen socket first.
	 */
	test = "listen_drop_inet1";
	printf("%s\n", test);
	bzero(&sun, sizeof(sun));
	save_sysctls(&inflight, &openfiles);
	s = my_socket(PF_INET, SOCK_STREAM, 0);
	my_bind(s, (struct sockaddr *)&sin, sizeof(sin));
	my_listen(s, -1);
	my_socketpair(sv);
	sendfd(sv[0], s);
	close3(s, sv[0], sv[1]);
	test_sysctls(inflight, openfiles);

	/*
	 * Close socketpair first.
	 */
	test = "listen_drop_inet2";
	printf("%s\n", test);
	bzero(&sun, sizeof(sun));
	save_sysctls(&inflight, &openfiles);
	s = my_socket(PF_INET, SOCK_STREAM, 0);
	my_bind(s, (struct sockaddr *)&sin, sizeof(sin));
	my_listen(s, -1);
	my_socketpair(sv);
	sendfd(sv[0], s);
	close3(sv[0], sv[1], s);
	test_sysctls(inflight, openfiles);
}
Exemplo n.º 7
0
int main(int argc, const char *argv[])
{
    int listenfd, connfd;
    struct sockaddr_in servaddr, cliaddr;
    socklen_t cliaddr_len;
    char buf[MAXLINE];
    char str[INET_ADDRSTRLEN];
    int n;
    pid_t pid;
    int filefd;

    listenfd = my_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(SERV_PORT);

    my_bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    my_listen(listenfd, 20);

    printf("Accepting connections...\n");

    while (1) 
    {
        cliaddr_len = sizeof(cliaddr);
        connfd = my_accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);

        pid = fork();
        if (pid == -1) 
        {
            perror("call to fork");
            exit(1);
        }
        else if (pid == 0) 
        {
            my_close(listenfd);
            n = my_read(connfd, buf, MAXLINE);
            filefd = open(buf, O_RDWR | O_CREAT | O_TRUNC, 0666);
            my_write(filefd, &buf[strlen(buf)+1], strlen(&buf[strlen(buf)+1]));
            while ((n = my_read(connfd, buf, MAXLINE))) 
            {
                printf("Received from %s at PORT %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));

                if (filefd < 0) 
                {
                    perror("create file error");
                    exit(1);
                }

                //for (i = 0; i < n; i++) 
                //{
                    //buf[i] = toupper(buf[i]);
                //}
                my_write(filefd, buf, n);
            }
            my_close(filefd);
            exit(0);
        }
        else 
        {
            my_close(connfd);
        }
    }

    return 0;
}