⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mkaddr.c

📁 实战Linux socket编程例题源代码
💻 C
字号:
/* mkaddr.c * * Make a socket address : */#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <errno.h>#include <ctype.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>/* * Create an AF_INET Address: * * ARGUMENTS: *  1.  addr    Ptr to area *              were address is *              to be placed. *  2.  addrlen Ptr to int that *              will hold the final *              address length. *  3.  str_addr The input string *              format hostname, and *              port. *  4.  protocol The input string *              indicating the *              protocol being used. *              NULL implies "tcp". * RETURNS: *  0   Success. *  -1  Bad host part. *  -2  Bad port part. * * NOTES: *  "*" for the host portion of the *  address implies INADDR_ANY. * *  "*" for the port portion will *  imply zero for the port (assign *  a port number.) * * EXAMPLES: *  "www.lwn.net:80" *  "localhost:telnet" *  "*:21" *  "*:*" *  "ftp.redhat.com:ftp" *  "sunsite.unc.edu" *  "sunsite.unc.edu:*" */intmkaddr(void *addr,  int *addrlen,  char *str_addr,  char *protocol) {    char *inp_addr = strdup(str_addr);    char *host_part = strtok(inp_addr,":");    char *port_part = strtok(NULL,"\n");    struct sockaddr_in *ap =        (struct sockaddr_in *) addr;    struct hostent *hp = NULL;    struct servent *sp = NULL;    char *cp;    long lv;    /*     * Set input defaults :     */    if ( !host_part )        host_part = "*";    if ( !port_part )        port_part = "*";    if ( !protocol )        protocol = "tcp";    /*     * Initialize the address structure :     */    memset(ap,0,*addrlen);    ap->sin_family = AF_INET;    ap->sin_port = 0;    ap->sin_addr.s_addr = INADDR_ANY;    /*     * Fill in the host address :     */    if ( strcmp(host_part,"*") == 0 )        ;   /* Leave as INADDR_ANY */    else if ( isdigit(*host_part) ) {        /*         * Numeric IP address :         */        if ( !inet_aton(host_part,            &ap->sin_addr) )            return -1;    } else {        /*         * Assume a host name :         */        hp = gethostbyname(            host_part);        if ( !hp )            return -1;        if ( hp->h_addrtype != AF_INET )            return -1;        ap->sin_addr =            * (struct in_addr *)            hp->h_addr_list[0];    }    /*     * Process an optional port # :     */    if ( !strcmp(port_part,"*") )        ; /* Leave as wild (zero) */    else if ( isdigit(*port_part) ) {        /*         * Process numeric port # :         */        lv = strtol(port_part,&cp,10);        if ( cp != NULL && *cp )            return -2;        if ( lv < 0L || lv >= 32768 )            return -2;        ap->sin_port = htons(            (short)lv);    } else {        /*         * Lookup the service :         */        sp = getservbyname(            port_part,            protocol);        if ( !sp )            return -2;        ap->sin_port =            (short) sp->s_port;    }    /* Return address length */    *addrlen = sizeof *ap;    free(inp_addr);    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -