예제 #1
0
int main(){
	char buf[INET_ADDRSTRLEN]={0};
	struct sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_addr.s_addr = inet_addr("192.168.4.135");
	printf("%s\n",my_inet_ntop(AF_INET,(const void *)&addr.sin_addr,buf,sizeof(buf)));	
//	printf("%s\n",inet_ntop(AF_INET,(const void *)&addr.sin_addr,buf,sizeof(buf)));
	return 0;
}
예제 #2
0
/*-------------------------------------------------------------------------*\
* Retrieves socket local name
\*-------------------------------------------------------------------------*/
int inet_meth_getsockname(lua_State *L, p_socket ps, int family)
{
    switch (family) {
        case PF_INET: {
            struct sockaddr_in local;
            socklen_t local_len = sizeof(local);
            char name[INET_ADDRSTRLEN];
            if (getsockname(*ps, (SA *) &local, &local_len) < 0) {
                lua_pushnil(L);
                lua_pushstring(L, socket_strerror(errno));
                return 2;
            } else {
                my_inet_ntop(family, &local.sin_addr, name, sizeof(name));
                lua_pushstring(L, name); 
                lua_pushnumber(L, ntohs(local.sin_port));
                lua_pushliteral(L, "inet");
                return 3;
            }
        }
        case PF_INET6: {
            struct sockaddr_in6 local;
            socklen_t local_len = sizeof(local);
            char name[INET6_ADDRSTRLEN];
            if (getsockname(*ps, (SA *) &local, &local_len) < 0) {
                lua_pushnil(L);
                lua_pushstring(L, socket_strerror(errno));
                return 2;
            } else {
                my_inet_ntop(family, &local.sin6_addr, name, sizeof(name));
                lua_pushstring(L, name); 
                lua_pushnumber(L, ntohs(local.sin6_port));
                lua_pushliteral(L, "inet6");
                return 3;
            }
        }
        default:
            lua_pushnil(L);
            lua_pushfstring(L, "unknown family %d", family);
            return 2;
    }
}
예제 #3
0
파일: udp.c 프로젝트: LiminWang/tsdecrypt
int udp_connect_input(struct io *io) {
	struct sockaddr_storage addr;
	int addrlen = sizeof(addr);
	int sock = -1;

	memset(&addr, 0, sizeof(addr));

	if (!io->isrc.s_addr)
		ts_LOGf("Connecting input to %s port %s\n", io->hostname, io->service);
	else
		ts_LOGf("Connecting input to %s port %s source %s\n", io->hostname, io->service, inet_ntoa(io->isrc));

	if (get_input_socket(io->hostname, io->service, SOCK_DGRAM, &addr, &addrlen, &sock) < 0)
		return -1;

	/* Set receive buffer size to ~2.0MB */
	int bufsize = (2000000 / 1316) * 1316;
	setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void *)&bufsize, sizeof(bufsize));

	if (is_multicast(&addr)) {
		if (join_multicast_group(sock, io->ttl, &addr) < 0) {
			close(sock);
			return -1;
		} else {
#ifdef IP_ADD_SOURCE_MEMBERSHIP
			if (io->isrc.s_addr && addr.ss_family == AF_INET) {
				/* Source-specific multicast */
				struct sockaddr_in *src = (struct sockaddr_in *)&addr;
				struct ip_mreq_source imr;
				memset(&imr, 0, sizeof(imr));
				imr.imr_multiaddr = src->sin_addr;
				imr.imr_sourceaddr = io->isrc;
				if (setsockopt(sock, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP,
				    (char *)&imr, sizeof(struct ip_mreq_source)) < 0)
				{
					char str_addr[INET6_ADDRSTRLEN];
					my_inet_ntop(addr.ss_family, (struct sockaddr *)&addr, str_addr, sizeof(str_addr));
					ts_LOGf("ERROR: Can't set multicast group %s source %s: %s\n",
						str_addr, inet_ntoa(io->isrc), strerror(errno));
				}
			}
#endif
		}
	}

	io->fd = sock;
	ts_LOGf("Input connected to fd:%d\n", io->fd);

	return 1;
}
예제 #4
0
파일: udp.c 프로젝트: LiminWang/tsdecrypt
static int get_socket(const char *hostname, const char *service, int socktype, struct sockaddr_storage *addr, int *addrlen, int *sock, bool is_output) {
	struct addrinfo hints, *res, *ressave;
	int n, ret = -1;

	memset(&hints, 0, sizeof(struct addrinfo));
	hints.ai_family = ai_family;
	hints.ai_socktype = socktype;

	n = getaddrinfo(hostname, service, &hints, &res);
	if (n < 0) {
		ts_LOGf("ERROR: getaddrinfo(%s): %s\n", hostname, gai_strerror(n));
		return ret;
	}

	ressave = res;
	while (res) {
		*sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
		if (*sock > -1) {
			int on = 1;
			setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
			set_sock_nonblock(*sock);
			if (is_output) {
				memcpy(addr, res->ai_addr, res->ai_addrlen);
				*addrlen = res->ai_addrlen;
				ret = 0;
				break;
			}
			if (bind(*sock, res->ai_addr, res->ai_addrlen) == 0) {
				memcpy(addr, res->ai_addr, res->ai_addrlen);
				*addrlen = res->ai_addrlen;
				ret = 0;
				break;
			} else {
				char str_addr[INET6_ADDRSTRLEN];
				my_inet_ntop(res->ai_family, res->ai_addr, str_addr, sizeof(str_addr));
				ts_LOGf("ERROR: bind: %s:%s (%s): %s\n",
					hostname, service, str_addr, strerror(errno));
			}
			close(*sock);
			*sock = -1;
		}
		res = res->ai_next;
	}
	freeaddrinfo(ressave);

	return ret;
}
예제 #5
0
int
main(int argc, char **argv)
{
    char    *ptr = NULL;
    char    **pptr = NULL;
    char    str[INET_ADDRSTRLEN];
    struct  hostent *hptr;

    while ( --argc > 0 )
    {
         ptr = *++argv;
         if ( (hptr = gethostbyname(ptr)) == NULL )
         {
             err_msg("gethostbyname error for host: %s: %s",
                     ptr, hstrerror(h_errno));
             continue;
         }

         printf("official hostname: %s\n", hptr->h_name);

         for (pptr = hptr->h_aliases; *pptr != NULL; pptr++)
         {
              printf("\talias: %s\n", *pptr);
         }

         switch (hptr->h_addrtype)
         {
             case AF_INET:
                 pptr = hptr->h_addr_list;
                 for( ; *pptr != NULL; pptr++ )
                 {
                      printf("\taddress: %s\n",
                              my_inet_ntop(hptr->h_addrtype, *pptr,
                                            str, sizeof(str)));
                 }
                 break;

             default:
                 err_ret("unknow address type");
                 break;
         }
    }

    exit(0);
}
예제 #6
0
void *
server_thread (void *arg)
{
    int interactive = (arg != NULL);
    socklen_t len;
    int request_len;
    client_t client;
    char remote_ip[16];
    char request[REQUESTLEN + 1];
    llist_entry *le;
    datum_t rootdatum;

    for (;;)
    {
        client.valid = 0;
        len = sizeof(client.addr);

        if (interactive)
        {
            pthread_mutex_lock(&server_interactive_mutex);
            SYS_CALL( client.fd, accept(interactive_socket->sockfd, (struct sockaddr *) &(client.addr), &len));
            pthread_mutex_unlock(&server_interactive_mutex);
        }
        else
        {
            pthread_mutex_lock  ( &server_socket_mutex );
            SYS_CALL( client.fd, accept(server_socket->sockfd, (struct sockaddr *) &(client.addr), &len));
            pthread_mutex_unlock( &server_socket_mutex );
        }
        if ( client.fd < 0 )
        {
            err_ret("server_thread() error");
            debug_msg("server_thread() %lx clientfd = %d errno=%d\n",
                      (unsigned long) pthread_self(), client.fd, errno);
            continue;
        }

        my_inet_ntop( AF_INET, (void *)&(client.addr.sin_addr), remote_ip, 16 );

        if ( !strcmp(remote_ip, "127.0.0.1")
                || gmetad_config.all_trusted
                || (llist_search(&(gmetad_config.trusted_hosts), (void *)remote_ip, strcmp, &le) == 0) )
        {
            client.valid = 1;
        }

        if(! client.valid )
        {
            debug_msg("server_thread() %s tried to connect and is not a trusted host",
                      remote_ip);
            close( client.fd );
            continue;
        }

        client.filter=0;
        client.http=0;
        gettimeofday(&client.now, NULL);

        if (interactive)
        {
            request_len = readline(client.fd, request, REQUESTLEN);
            if (request_len < 0)
            {
                err_msg("server_thread() could not read request from %s", remote_ip);
                close(client.fd);
                continue;
            }
            debug_msg("server_thread() received request \"%s\" from %s", request, remote_ip);

            if (process_request(&client, request))
            {
                err_msg("Got a malformed path request from %s", remote_ip);
                close(client.fd);
                continue;
            }
        }
        else
            strcpy(request, "/");

        if(root_report_start(&client))
        {
            err_msg("server_thread() %lx unable to write root preamble (DTD, etc)",
                    (unsigned long) pthread_self() );
            close(client.fd);
            continue;
        }

        /* Start search at the root node. */
        rootdatum.data = &root;
        rootdatum.size = sizeof(root);

        if (process_path(&client, request, &rootdatum, NULL))
        {
            err_msg("server_thread() %lx unable to write XML tree info",
                    (unsigned long) pthread_self() );
            close(client.fd);
            continue;
        }

        if(root_report_end(&client))
        {
            err_msg("server_thread() %lx unable to write root epilog",
                    (unsigned long) pthread_self() );
        }

        close(client.fd);
    }
}
예제 #7
0
//p258
//执行服务器的通常步骤
int
tcp_listen(const char *host, const char *serv, socklen_t *addrlenp)
{
    int    listenfd = 0;
    int    n = 0;
    const  int         on = 1;
    struct addrinfo    hints;
    struct addrinfo    *res = NULL;
    struct addrinfo    *ressave = NULL;

    bzero(&hints, sizeof(struct addrinfo));
    hints.ai_flags     = AI_PASSIVE;
    hints.ai_family    = AF_UNSPEC;
    hints.ai_socktype  = SOCK_STREAM;

    printf("listen中!!!");
    //if n != 0, 表示error
    if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0 )
    {
        err_quit("tcp_listen error for %s, %s: %s",
                 host, serv, gai_strerror(n));
    }

    ressave = res;             //保存res

    do
    {
        //系统调用
        listenfd = socket(res->ai_family,
                          res->ai_socktype,
                          res->ai_protocol);

        if (listenfd < 0)
        {
            continue;        //error, try next one
        }

        my_setsockopt(listenfd, SOL_SOCKET,
                      SO_REUSEADDR,
                      &on, sizeof(on));

        //系统调用
        if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0)
        {
            break;       //success!
        }

        my_close(listenfd);
    } while( (res = res->ai_next) != NULL );

    if (res == NULL)
    {
        err_sys("tcp_listen error for %s, %s", host, serv);
    }

    my_listen(listenfd, LISTENQ);

    if (addrlenp)      //addrlenp是一个指针
    {
        //return size of protocal address(值结果参数)
        *addrlenp = res->ai_addrlen;
    }


    //printf("")
    struct sockaddr   test ;
    printf("ai_addr = %s\n", my_inet_ntop(AF_INET, (const char *)ressave->ai_addr, (char*)&test, sizeof(test)));


    freeaddrinfo(ressave);

    return (listenfd);
}
예제 #8
0
파일: helper.c 프로젝트: Steamrunner/teg
/* find the internet address of a player */
TEG_STATUS aux_find_inaddr( PSPLAYER pJ )
{
    struct sockaddr *sa;
    socklen_t slen = 128;

    assert(pJ);

    strncpy(pJ->addr, _("Unknown"), sizeof(pJ->addr)-1);

#ifdef WITH_GGZ
    if(g_server.with_ggz) {
        strncpy(pJ->addr, _("GGZ Client"), sizeof(pJ->addr)-1);
        return TEG_STATUS_SUCCESS;
    }
#endif /* WITH_GGZ */

    if( pJ->fd <= 0)
        return TEG_STATUS_ERROR;

    if( (sa=malloc(slen)) == NULL )
        return TEG_STATUS_ERROR;

    if( getpeername( pJ->fd, sa, &slen ) == -1) {
        con_text_out(M_ERR,"Error in getpeername()\n");
        pJ->addr[sizeof(pJ->addr)-1]=0;

        free(sa);
        return TEG_STATUS_ERROR;
    }

    switch(sa->sa_family) {
    case AF_INET: {
        struct sockaddr_in *sin = (struct sockaddr_in*) sa;
        my_inet_ntop( AF_INET, &sin->sin_addr,pJ->addr, sizeof(pJ->addr)-1);
        break;
    }
    case AF_INET6: {
        struct sockaddr_in6 *sin6 = (struct sockaddr_in6*) sa;
        my_inet_ntop( AF_INET6, &sin6->sin6_addr,pJ->addr, sizeof(pJ->addr)-1);
        break;
    }
    case AF_UNIX:
        strncpy(pJ->addr,"127.0.0.1",sizeof(pJ->addr)-1);
        break;
#if 0
        {
            struct sockaddr_un *unp = (struct sockaddr_un *) sa;
            if(unp->sun_path[0]==0)
                strncpy(pJ->addr,_("Unknown"),sizeof(pJ->addr)-1);
            else
                snprintf(pJ->addr, sizeof(pJ->addr)-1, "%s", unp->sun_path);
            break;
        }
#endif
    default:
        break;
    }

    pJ->addr[sizeof(pJ->addr)-1]=0;

    strip_invalid(pJ->addr);

    free(sa);

    return TEG_STATUS_SUCCESS;
}