コード例 #1
0
ファイル: daemon.c プロジェクト: jeffpc/blahgd
static int start_listening(void)
{
	struct addrinfo hints, *res, *p;
	char port[10];

	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_PASSIVE;

	snprintf(port, sizeof(port), "%d", config.scgi_port);

	if (getaddrinfo(HOST, port, &hints, &res))
		return -1;

	for (p = res; p; p = p->ai_next) {
		struct sockaddr_in *ipv4;
		struct sockaddr_in6 *ipv6;
		char str[64];
		void *addr;
		int ret;

		switch (p->ai_family) {
			case AF_INET:
				ipv4 = (struct sockaddr_in *) p->ai_addr;
				addr = &ipv4->sin_addr;
				break;
			case AF_INET6:
				ipv6 = (struct sockaddr_in6 *) p->ai_addr;
				addr = &ipv6->sin6_addr;
				break;
			default:
				DBG("Unsupparted address family: %d",
				    p->ai_family);
				addr = NULL;
				break;
		}

		if (!addr)
			continue;

		inet_ntop(p->ai_family, addr, str, sizeof(str));

		ret = bind_sock(p->ai_family, p->ai_addr, p->ai_addrlen);
		if (ret && ret != -EAFNOSUPPORT)
			return ret;
		else if (!ret)
			cmn_err(CE_INFO, "Bound to: %s %s", str, port);
	}

	freeaddrinfo(res);

	return 0;
}
コード例 #2
0
ファイル: func.c プロジェクト: okon3/reti2012
int UDP_sock(in_port_t port){
	int sock;
	struct sockaddr_in Local;

	sock = get_sock(SOCK_DGRAM);
	set_sock(sock);
	name_sock(&Local, htonl(INADDR_ANY), port);
	bind_sock(sock, &Local);

	printf("Socket UDP sulla porta %d creato\n", ntohs(port));

	return sock;
}
コード例 #3
0
ファイル: func.c プロジェクト: okon3/reti2012
int TCP_sock_snd(in_addr_t ip, in_port_t port){
	int sock;
	char ipstr[15];
	struct sockaddr_in Local, To;
	inet_ntop(AF_INET, &ip, ipstr,(socklen_t)15); /* conversione a stringa dell'ip per stamparlo */

	sock = get_sock(SOCK_STREAM);
	set_sock(sock);
	name_sock(&Local, htonl(INADDR_ANY), 0);
	bind_sock(sock, &Local);
	name_sock(&To, ip, port);
	connect_sock(sock, &To);

	printf ("Connessione TCP con %s avvenuta\n",ipstr);

	return sock;
}
コード例 #4
0
ファイル: handle_type.c プロジェクト: mbarbari/ft_p
t_cli		handle_pasv(t_env env, t_cli cli, char *str)
{
	struct sockaddr_in6	sin;
	socklen_t			len;
	char				ip[16];
	unsigned short		port;

	(void)env;
	(void)str;
	port = 0;
	if (cli.istransferable)
		close(cli.env.data_fd);
	cli.env.data_fd = init_sock(cli.env);
	cli.env = bind_sock(cli.env, &cli.env.data_fd, &port);
	len = sizeof(sin);
	getsockname(cli.fd, (struct sockaddr*)&sin, &len);
	if (IN6_IS_ADDR_V4MAPPED(&sin.sin6_addr))
	{
		ft_memcpy(ip, sin.sin6_addr.s6_addr + 12, 4);
		S_MESSAGE(227, cli.fd, (int)ip[0], (int)ip[1], (int)ip[2],
				(int)ip[3], (port >> 8) & 0xFF, port & 0xFF);
		cli.istransferable = TRUE;
	}
コード例 #5
0
ファイル: func.c プロジェクト: okon3/reti2012
int TCP_sock_rcv(in_port_t port){
	int sock, sock_rcv;
	int porta;
	struct sockaddr_in Local, From;
	char ipstr[15];

	porta = ntohs(port);

	sock = get_sock(SOCK_STREAM);
	set_sock(sock);
	name_sock(&Local, htonl(INADDR_ANY), port);
	bind_sock(sock, &Local);
	listen_sock(sock);

	printf("Attendo una connessione TCP sulla porta %d\n\n", porta);

	sock_rcv = accept_sock(sock, &From);

	inet_ntop(AF_INET, &From.sin_addr, ipstr,(socklen_t)15); /* conversione a stringa dell'ip per stamparlo */

	printf("Connessione TCP da %s : %d\n\n", ipstr,	ntohs(From.sin_port));

	return sock_rcv;
}
コード例 #6
0
ファイル: server.c プロジェクト: kevin4fly/network
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("usage: ./server <#port>\n");
        exit(EXIT_FAILURE);
    }
    int port = atoi(argv[1]);

    /* SIGCHLD handler */
    struct sigaction sigchld;
    sigchld.sa_handler = chld_handler;
    sigemptyset(&sigchld.sa_mask);
    sigchld.sa_flags = 0;
    sigaction(SIGCHLD,&sigchld,NULL);

    int listenfd = bind_sock(port);

    listen_sock(listenfd);

    handle_connection(listenfd);

    return 0;
}
コード例 #7
0
ファイル: socket.cpp プロジェクト: tmiw/kite-llvm
                /*****************************************************************************
                 * Perform DNS lookup
                 ****************************************************************************/
                int 
                socket::dnsLookup(const char *host, int port, int mode)
                {
                    struct sockaddr *sa;
                    struct addrinfo hints;
                    struct addrinfo *res;
                    int ret = 0;
                    int err = 0;
                    int sock = socket_val;
                    size_t salen;
                    char buf[128];
                    int socktype;
                    socklen_t len = sizeof(socklen_t);
#ifndef WIN32
                    struct sockaddr_un local;
#endif /* WIN32 */

                    /* Unix domain sockets */
#ifndef WIN32
                    if (host[0] == '/')
                    {
                        properties["unix_socket"] = new boolean(true);

                        local.sun_family = AF_UNIX;
                        strcpy(local.sun_path, host);

                        if (mode)
                        {
                            unlink(local.sun_path);
                            ret = bind_sock(sock, (struct sockaddr*)&local, sizeof(local));
                        }
                        else
                        {
                            ret = connect_sock(sock, (struct sockaddr*)&local, sizeof(local));
                        }
                    }
                    else
                    {
#endif
                        properties["unix_socket"] = new boolean(false);

                        /* AF_INET[6] */
                        memset(&hints, 0, sizeof(hints));
                        sprintf(buf, "%d", port);

                        getsockopt(sock, SOL_SOCKET, SO_TYPE, (char*)&socktype, &len);

                        /* set-up hints structure */
                        hints.ai_family = AF_UNSPEC;
                        hints.ai_socktype = socktype;
                        if (mode) hints.ai_flags = AI_PASSIVE;
                        err = getaddrinfo(host, buf, &hints, &res);
                        if (err)
                        {
                            if (res) freeaddrinfo(res);
                            
                            exceptions::DnsError *exc = exceptions::DnsError::Create(
                                1,
                                new string((char*)gai_strerror(err))
                            );
                            exc->throw_exception();
                        }
                        else 
                        {
                            struct addrinfo *top = res;
                            while (res) {
                                sa = res->ai_addr;
                                salen = res->ai_addrlen;

                                if (mode)
                                {
                                    /* bind() */
                                    ret = bind_sock(sock, sa, salen);
                                    if (ret < 0) goto end_socket;
                                }
                                else
                                {
                                    /* connect() */
                                    ret = connect_sock(sock, sa, salen);
                                    if (ret == 0) goto end_socket;
                                }

                                res = res->ai_next;
                            }
end_socket:
                            freeaddrinfo(top);
                        }
#ifndef WIN32
                    }
#endif
                    return ret;
                }