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

📄 ip.c

📁 用于移植到嵌入式linux系统的boa http服务器
💻 C
字号:
/* *  Boa, an http server *  Copyright (C) 1999 Larry Doolittle <ldoolitt@boa.org> *  Copyright (C) 2000-2003 Jon Nelson <jnelson@boa.org> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 1, or (at your option) *  any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *  Encapsulation of ipv4 and ipv6 stuff, try to get rid of the ifdef's  elsewhere in the code.  The IPv6 code here is based on contributions from Martin Hinner <martin@tdp.cz>  and Arkadiusz Miskiewicz <misiek@misiek.eu.org>.  This incarnation of that  code is untested.  The original IPv4 code is based on original Boa code  from Paul Phillips <paulp@go2net.com>.  A goal is to compile in as many families as are supported, and  make the final choice at runtime.globals.h:#ifdef INET6	char remote_ip_addr[BOA_NI_MAXHOST];#else	char remote_ip_addr[20];        after inet_ntoa#endif    None of this code interacts with the rest of Boa except through    the parameter lists and return values.    Consider making these functions __inline__ and using this as a .h file    */#include "boa.h"#include <arpa/inet.h>          /* inet_ntoa *//* Binds to the existing server_s, based on the configuration string   in server_ip.  IPv6 version doesn't pay attention to server_ip yet.  */int bind_server(int sock, char *ip, unsigned int port){#ifdef INET6    struct sockaddr_in6 server_sockaddr;    server_sockaddr.sin6_family = PF_INET6;    memcpy(&server_sockaddr.sin6_addr, &in6addr_any, sizeof (in6addr_any));    server_sockaddr.sin6_port = htons(server_port);#else    struct sockaddr_in server_sockaddr;    memset(&server_sockaddr, 0, sizeof server_sockaddr);#ifdef HAVE_SIN_LEN             /* uncomment for BSDs */    server_sockaddr.sin_len = sizeof server_sockaddr;#endif    server_sockaddr.sin_family = PF_INET;    if (ip != NULL) {#ifdef HAVE_INET_ATON        inet_aton(ip, &server_sockaddr.sin_addr);#elif defined HAVE_INET_ADDR        server_sockaddr.sin_addr.s_addr = inet_addr(ip);#else#error "Neither inet_aton nor inet_addr exist!"#endif    } else {        server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);    }    server_sockaddr.sin_port = htons(port);#endif    return bind(sock, (struct sockaddr *) &server_sockaddr,                sizeof (server_sockaddr));}char *ascii_sockaddr(struct SOCKADDR *s, char *dest, unsigned int len){#ifdef INET6    if (getnameinfo((struct sockaddr *) s,                    sizeof (struct SOCKADDR),                    dest, len, NULL, 0, NI_NUMERICHOST)) {        fprintf(stderr, "[IPv6] getnameinfo failed\n");        *dest = '\0';    }#ifdef WHEN_DOES_THIS_APPLY#error Dont use memmove    if ((s->__ss_family == PF_INET6) &&        IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6 *) s)->sin6_addr))) {#error The following two lines are broken        memmove(dest, dest + 7, BOA_NI_MAXHOST);        dest[BOA_NI_MAXHOST] = '\0';    }#endif /* ifdef WHEN_DOES_THIS_APPLY */#else  /* ifdef INET6 */    unsigned int newlen;    char *buf;    /*    memmove(dest, inet_ntoa(s->sin_addr), len); */    buf = inet_ntoa(s->sin_addr);    newlen = strlen(buf);    /* we need newlen + 1 byte to be <= len, thus     * newlen <= len - 1 is good     * and newlen > len -1 is bad thus     *     newlen + 1 > len ==== newlen >= len     */    if (newlen + 1 > len) { /* too many bytes incl. the NUL */        return NULL;    }    memcpy(dest, buf, newlen);    dest[newlen] = '\0';#endif /* ifdef INET6 */    return dest;}int net_port(struct SOCKADDR *s){    int p = -1;#ifdef INET6    char serv[NI_MAXSERV];    if (getnameinfo((struct sockaddr *) s,                    sizeof (struct SOCKADDR),                    NULL, 0, serv, sizeof (serv), NI_NUMERICSERV)) {        fprintf(stderr, "[IPv6] getnameinfo failed\n");    } else {        p = atoi(serv);    }#else    p = ntohs(s->sin_port);#endif    return p;}

⌨️ 快捷键说明

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