unp.h的安装以及第一个程序的运行

  1. 源代码下载以及编译

    点击此处下载源代码

    解压到本地文件夹,如果访问不了GitHub的话就用我搬到gitee的仓库吧

    git clone https://gitee.com/Find-ing/unpv13e.git

    直接这样就不用解压了

    这里可以看看README

    按照README上的顺序

    首先执行./configure

    然后

    cd lib
    make
    cd ../libfree
    make
    cd ../libroute
    make

    如果出现了错误,就再来一次

    cd ../lib
    make
    cd ../libfree
    make
    cd ../libroute
    make

    第二遍做完之后,如果出现了如下错误:

    [root@docker libfree]# cd ../libroute
    [root@docker libroute]# make
    gcc -I../lib -g -O2 -D_REENTRANT -Wall -c -o get_rtaddrs.o get_rtaddrs.c
    In file included from get_rtaddrs.c:1:
    unproute.h:3:10: fatal error: net/if_dl.h: No such file or directory
    #include <net/if_dl.h> /* sockaddr_sdl{} */
    ^~~~~~~~~~~~~
    compilation terminated.
    make: *** [<builtin>: get_rtaddrs.o] Error 1

    哈哈哈,看了半天教程,改了好久也没搞好,仔细看看README,我真是

​ 好,仔细看看README怎么说的

>     cd ../libroute # only if your system supports 4.4BSD style routing sockets
> make # only if your system supports 4.4BSD style routing sockets <font color='red'>only if your system supports 4.4BSD style routing sockets</font> okok,下一步

​ 可以看到内容已经被编译到unpv13e/libunp.a里面去了

  1. 拷贝

    sudo cp libunp.a /usr/lib
    sudo cp libunp.a /usr/lib64
    # 有的系统可能没有这个文件夹,那就不用拷贝这个了,反正我的有

    .\lib\unp.h中将#include "../config.h"改为#include "config.h"

    然后

    sudo cp config.h /usr/include
    sudo cp lib/unp.h /usr/include
  2. 现在是第三阶段,因为我们在运行代码时会报一个错

    /tmp/ccM5DNZP.o: In function `main':
    test.c:(.text+0x2c): undefined reference to `err_quit'
    test.c:(.text+0x58): undefined reference to `err_sys'
    test.c:(.text+0xd2): undefined reference to `err_quit'
    test.c:(.text+0xfe): undefined reference to `err_sys'
    test.c:(.text+0x13a): undefined reference to `err_sys'
    test.c:(.text+0x171): undefined reference to `err_sys'
    collect2: error: ld returned 1 exit status

    原因是err_quit,err_sys等这些函数都是作者自己定义的函数真正的函数在http://www.apuebook.com/code3e.html下载。

    error.c的文件名改为myerr.c

    apue.h文件最后一行#endif /* _APUE_H */前加入#include "myerr.c"

    unp.h中加入#include "apue.h"

    apue.hmyerr.c文件都拷贝到/usr/include中去

    上面这些改改找找的操作各位要是想做就可以做一遍,如果是在不想做,就按照下面的操作

    打开/usr/include

    然后删除unp.h里面所有内容,然后复制这一段粘进去

    /* include unph */
    /* Our own header. Tabs are set for 4 spaces, not 8 */ #ifndef __unp_h
    #define __unp_h
    #include "apue.h"
    #include "config.h" /* configuration options for current OS */
    /* "../config.h" is generated by configure */
    #define MAX_LINE 2048
    /* If anything changes in the following list of #includes, must change
    acsite.m4 also, for configure's tests. */ #include <sys/types.h> /* basic system data types */
    #include <sys/socket.h> /* basic socket definitions */
    #if TIME_WITH_SYS_TIME
    #include <sys/time.h> /* timeval{} for select() */
    #include <time.h> /* timespec{} for pselect() */
    #else
    #if HAVE_SYS_TIME_H
    #include <sys/time.h> /* includes <time.h> unsafely */
    #else
    #include <time.h> /* old system? */
    #endif
    #endif
    #include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
    #include <arpa/inet.h> /* inet(3) functions */
    #include <errno.h>
    #include <fcntl.h> /* for nonblocking */
    #include <netdb.h>
    #include <signal.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/stat.h> /* for S_xxx file mode constants */
    #include <sys/uio.h> /* for iovec{} and readv/writev */
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/un.h> /* for Unix domain sockets */ #ifdef HAVE_SYS_SELECT_H
    # include <sys/select.h> /* for convenience */
    #endif #ifdef HAVE_SYS_SYSCTL_H
    #ifdef HAVE_SYS_PARAM_H
    # include <sys/param.h> /* OpenBSD prereq for sysctl.h */
    #endif
    # include <sys/sysctl.h>
    #endif #ifdef HAVE_POLL_H
    # include <poll.h> /* for convenience */
    #endif #ifdef HAVE_SYS_EVENT_H
    # include <sys/event.h> /* for kqueue */
    #endif #ifdef HAVE_STRINGS_H
    # include <strings.h> /* for convenience */
    #endif /* Three headers are normally needed for socket/file ioctl's:
    * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>.
    */
    #ifdef HAVE_SYS_IOCTL_H
    # include <sys/ioctl.h>
    #endif
    #ifdef HAVE_SYS_FILIO_H
    # include <sys/filio.h>
    #endif
    #ifdef HAVE_SYS_SOCKIO_H
    # include <sys/sockio.h>
    #endif #ifdef HAVE_PTHREAD_H
    # include <pthread.h>
    #endif #ifdef HAVE_NET_IF_DL_H
    # include <net/if_dl.h>
    #endif #ifdef HAVE_NETINET_SCTP_H
    #include <netinet/sctp.h>
    #endif /* OSF/1 actually disables recv() and send() in <sys/socket.h> */
    #ifdef __osf__
    #undef recv
    #undef send
    #define recv(a,b,c,d) recvfrom(a,b,c,d,0,0)
    #define send(a,b,c,d) sendto(a,b,c,d,0,0)
    #endif #ifndef INADDR_NONE
    /* $$.Ic INADDR_NONE$$ */
    #define INADDR_NONE 0xffffffff /* should have been in <netinet/in.h> */
    #endif #ifndef SHUT_RD /* these three POSIX names are new */
    #define SHUT_RD 0 /* shutdown for reading */
    #define SHUT_WR 1 /* shutdown for writing */
    #define SHUT_RDWR 2 /* shutdown for reading and writing */
    /* $$.Ic SHUT_RD$$ */
    /* $$.Ic SHUT_WR$$ */
    /* $$.Ic SHUT_RDWR$$ */
    #endif /* *INDENT-OFF* */
    #ifndef INET_ADDRSTRLEN
    /* $$.Ic INET_ADDRSTRLEN$$ */
    #define INET_ADDRSTRLEN 16 /* "ddd.ddd.ddd.ddd\0"
    1234567890123456 */
    #endif /* Define following even if IPv6 not supported, so we can always allocate
    an adequately sized buffer without #ifdefs in the code. */
    #ifndef INET6_ADDRSTRLEN
    /* $$.Ic INET6_ADDRSTRLEN$$ */
    #define INET6_ADDRSTRLEN 46 /* max size of IPv6 address string:
    "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx" or
    "xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd\0"
    1234567890123456789012345678901234567890123456 */
    #endif
    /* *INDENT-ON* */ /* Define bzero() as a macro if it's not in standard C library. */
    #ifndef HAVE_BZERO
    #define bzero(ptr,n) memset(ptr, 0, n)
    /* $$.If bzero$$ */
    /* $$.If memset$$ */
    #endif /* Older resolvers do not have gethostbyname2() */
    #ifndef HAVE_GETHOSTBYNAME2
    #define gethostbyname2(host,family) gethostbyname((host))
    #endif /* The structure returned by recvfrom_flags() */
    struct unp_in_pktinfo {
    struct in_addr ipi_addr; /* dst IPv4 address */
    int ipi_ifindex;/* received interface index */
    };
    /* $$.It unp_in_pktinfo$$ */
    /* $$.Ib ipi_addr$$ */
    /* $$.Ib ipi_ifindex$$ */ /* We need the newer CMSG_LEN() and CMSG_SPACE() macros, but few
    implementations support them today. These two macros really need
    an ALIGN() macro, but each implementation does this differently. */
    #ifndef CMSG_LEN
    /* $$.Im CMSG_LEN$$ */
    #define CMSG_LEN(size) (sizeof(struct cmsghdr) + (size))
    #endif
    #ifndef CMSG_SPACE
    /* $$.Im CMSG_SPACE$$ */
    #define CMSG_SPACE(size) (sizeof(struct cmsghdr) + (size))
    #endif /* POSIX requires the SUN_LEN() macro, but not all implementations DefinE
    it (yet). Note that this 4.4BSD macro works regardless whether there is
    a length field or not. */
    #ifndef SUN_LEN
    /* $$.Im SUN_LEN$$ */
    # define SUN_LEN(su) \
    (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
    #endif /* POSIX renames "Unix domain" as "local IPC."
    Not all systems DefinE AF_LOCAL and PF_LOCAL (yet). */
    #ifndef AF_LOCAL
    #define AF_LOCAL AF_UNIX
    #endif
    #ifndef PF_LOCAL
    #define PF_LOCAL PF_UNIX
    #endif /* POSIX requires that an #include of <poll.h> DefinE INFTIM, but many
    systems still DefinE it in <sys/stropts.h>. We don't want to include
    all the STREAMS stuff if it's not needed, so we just DefinE INFTIM here.
    This is the standard value, but there's no guarantee it is -1. */
    #ifndef INFTIM
    #define INFTIM (-1) /* infinite poll timeout */
    /* $$.Ic INFTIM$$ */
    #ifdef HAVE_POLL_H
    #define INFTIM_UNPH /* tell unpxti.h we defined it */
    #endif
    #endif /* Following could be derived from SOMAXCONN in <sys/socket.h>, but many
    kernels still #define it as 5, while actually supporting many more */
    #define LISTENQ 1024 /* 2nd argument to listen() */ /* Miscellaneous constants */
    #define MAXLINE 4096 /* max text line length */
    #define BUFFSIZE 8192 /* buffer size for reads and writes */ /* Define some port number that can be used for our examples */
    #define SERV_PORT 9877 /* TCP and UDP */
    #define SERV_PORT_STR "9877" /* TCP and UDP */
    #define UNIXSTR_PATH "/tmp/unix.str" /* Unix domain stream */
    #define UNIXDG_PATH "/tmp/unix.dg" /* Unix domain datagram */
    /* $$.ix [LISTENQ]~constant,~definition~of$$ */
    /* $$.ix [MAXLINE]~constant,~definition~of$$ */
    /* $$.ix [BUFFSIZE]~constant,~definition~of$$ */
    /* $$.ix [SERV_PORT]~constant,~definition~of$$ */
    /* $$.ix [UNIXSTR_PATH]~constant,~definition~of$$ */
    /* $$.ix [UNIXDG_PATH]~constant,~definition~of$$ */ /* Following shortens all the typecasts of pointer arguments: */
    #define SA struct sockaddr #ifndef HAVE_STRUCT_SOCKADDR_STORAGE
    /*
    * RFC 3493: protocol-independent placeholder for socket addresses
    */
    #define __SS_MAXSIZE 128
    #define __SS_ALIGNSIZE (sizeof(int64_t))
    #ifdef HAVE_SOCKADDR_SA_LEN
    #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(u_char) - sizeof(sa_family_t))
    #else
    #define __SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(sa_family_t))
    #endif
    #define __SS_PAD2SIZE (__SS_MAXSIZE - 2*__SS_ALIGNSIZE) struct sockaddr_storage {
    #ifdef HAVE_SOCKADDR_SA_LEN
    u_char ss_len;
    #endif
    sa_family_t ss_family;
    char __ss_pad1[__SS_PAD1SIZE];
    int64_t __ss_align;
    char __ss_pad2[__SS_PAD2SIZE];
    };
    #endif #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
    /* default file access permissions for new files */
    #define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
    /* default permissions for new directories */ typedef void Sigfunc(int); /* for signal handlers */ #define min(a,b) ((a) < (b) ? (a) : (b))
    #define max(a,b) ((a) > (b) ? (a) : (b)) #ifndef HAVE_ADDRINFO_STRUCT
    # include "../lib/addrinfo.h"
    #endif #ifndef HAVE_IF_NAMEINDEX_STRUCT
    struct if_nameindex {
    unsigned int if_index; /* 1, 2, ... */
    char *if_name; /* null-terminated name: "le0", ... */
    };
    /* $$.It if_nameindex$$ */
    /* $$.Ib if_index$$ */
    /* $$.Ib if_name$$ */
    #endif #ifndef HAVE_TIMESPEC_STRUCT
    struct timespec {
    time_t tv_sec; /* seconds */
    long tv_nsec; /* and nanoseconds */
    };
    /* $$.It timespec$$ */
    /* $$.Ib tv_sec$$ */
    /* $$.Ib tv_nsec$$ */
    #endif
    /* end unph */ /* prototypes for our own library functions */
    int connect_nonb(int, const SA *, socklen_t, int);
    int connect_timeo(int, const SA *, socklen_t, int);
    int daemon_init(const char *, int);
    void daemon_inetd(const char *, int);
    void dg_cli(FILE *, int, const SA *, socklen_t);
    void dg_echo(int, SA *, socklen_t);
    int family_to_level(int);
    char *gf_time(void);
    void heartbeat_cli(int, int, int);
    void heartbeat_serv(int, int, int);
    struct addrinfo *host_serv(const char *, const char *, int, int);
    int inet_srcrt_add(char *);
    u_char *inet_srcrt_init(int);
    void inet_srcrt_print(u_char *, int);
    void inet6_srcrt_print(void *);
    char **my_addrs(int *);
    int readable_timeo(int, int);
    ssize_t readline(int, void *, size_t);
    ssize_t readn(int, void *, size_t);
    ssize_t read_fd(int, void *, size_t, int *);
    ssize_t recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,
    struct unp_in_pktinfo *);
    Sigfunc *signal_intr(int, Sigfunc *);
    int sock_bind_wild(int, int);
    int sock_cmp_addr(const SA *, const SA *, socklen_t);
    int sock_cmp_port(const SA *, const SA *, socklen_t);
    int sock_get_port(const SA *, socklen_t);
    void sock_set_addr(SA *, socklen_t, const void *);
    void sock_set_port(SA *, socklen_t, int);
    void sock_set_wild(SA *, socklen_t);
    char *sock_ntop(const SA *, socklen_t);
    char *sock_ntop_host(const SA *, socklen_t);
    int sockfd_to_family(int);
    void str_echo(int);
    void str_cli(FILE *, int);
    int tcp_connect(const char *, const char *);
    int tcp_listen(const char *, const char *, socklen_t *);
    void tv_sub(struct timeval *, struct timeval *);
    int udp_client(const char *, const char *, SA **, socklen_t *);
    int udp_connect(const char *, const char *);
    int udp_server(const char *, const char *, socklen_t *);
    int writable_timeo(int, int);
    ssize_t writen(int, const void *, size_t);
    ssize_t write_fd(int, void *, size_t, int); #ifdef MCAST
    int mcast_leave(int, const SA *, socklen_t);
    int mcast_join(int, const SA *, socklen_t, const char *, u_int);
    int mcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,
    const SA *grp, socklen_t grplen);
    int mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,
    const SA *grp, socklen_t grplen,
    const char *ifname, u_int ifindex);
    int mcast_block_source(int sockfd, const SA *src, socklen_t srclen,
    const SA *grp, socklen_t grplen);
    int mcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,
    const SA *grp, socklen_t grplen);
    int mcast_get_if(int);
    int mcast_get_loop(int);
    int mcast_get_ttl(int);
    int mcast_set_if(int, const char *, u_int);
    int mcast_set_loop(int, int);
    int mcast_set_ttl(int, int); void Mcast_leave(int, const SA *, socklen_t);
    void Mcast_join(int, const SA *, socklen_t, const char *, u_int);
    void Mcast_leave_source_group(int sockfd, const SA *src, socklen_t srclen,
    const SA *grp, socklen_t grplen);
    void Mcast_join_source_group(int sockfd, const SA *src, socklen_t srclen,
    const SA *grp, socklen_t grplen,
    const char *ifname, u_int ifindex);
    void Mcast_block_source(int sockfd, const SA *src, socklen_t srclen,
    const SA *grp, socklen_t grplen);
    void Mcast_unblock_source(int sockfd, const SA *src, socklen_t srclen,
    const SA *grp, socklen_t grplen);
    int Mcast_get_if(int);
    int Mcast_get_loop(int);
    int Mcast_get_ttl(int);
    void Mcast_set_if(int, const char *, u_int);
    void Mcast_set_loop(int, int);
    void Mcast_set_ttl(int, int);
    #endif uint16_t in_cksum(uint16_t *, int); #ifndef HAVE_GETADDRINFO_PROTO
    int getaddrinfo(const char *, const char *, const struct addrinfo *,
    struct addrinfo **);
    void freeaddrinfo(struct addrinfo *);
    char *gai_strerror(int);
    #endif #ifndef HAVE_GETNAMEINFO_PROTO
    int getnameinfo(const SA *, socklen_t, char *, size_t, char *, size_t, int);
    #endif #ifndef HAVE_GETHOSTNAME_PROTO
    int gethostname(char *, int);
    #endif #ifndef HAVE_HSTRERROR_PROTO
    const char *hstrerror(int);
    #endif #ifndef HAVE_IF_NAMETOINDEX_PROTO
    unsigned int if_nametoindex(const char *);
    char *if_indextoname(unsigned int, char *);
    void if_freenameindex(struct if_nameindex *);
    struct if_nameindex *if_nameindex(void);
    #endif #ifndef HAVE_INET_PTON_PROTO
    int inet_pton(int, const char *, void *);
    const char *inet_ntop(int, const void *, char *, size_t);
    #endif #ifndef HAVE_INET_ATON_PROTO
    int inet_aton(const char *, struct in_addr *);
    #endif #ifndef HAVE_PSELECT_PROTO
    int pselect(int, fd_set *, fd_set *, fd_set *,
    const struct timespec *, const sigset_t *);
    #endif #ifndef HAVE_SOCKATMARK_PROTO
    int sockatmark(int);
    #endif #ifndef HAVE_SNPRINTF_PROTO
    int snprintf(char *, size_t, const char *, ...);
    #endif /* prototypes for our own library wrapper functions */
    void Connect_timeo(int, const SA *, socklen_t, int);
    int Family_to_level(int);
    struct addrinfo *Host_serv(const char *, const char *, int, int);
    const char *Inet_ntop(int, const void *, char *, size_t);
    void Inet_pton(int, const char *, void *);
    char *If_indextoname(unsigned int, char *);
    unsigned int If_nametoindex(const char *);
    struct if_nameindex *If_nameindex(void);
    char **My_addrs(int *);
    ssize_t Read_fd(int, void *, size_t, int *);
    int Readable_timeo(int, int);
    ssize_t Recvfrom_flags(int, void *, size_t, int *, SA *, socklen_t *,
    struct unp_in_pktinfo *);
    Sigfunc *Signal(int, Sigfunc *);
    Sigfunc *Signal_intr(int, Sigfunc *);
    int Sock_bind_wild(int, int);
    char *Sock_ntop(const SA *, socklen_t);
    char *Sock_ntop_host(const SA *, socklen_t);
    int Sockfd_to_family(int);
    int Tcp_connect(const char *, const char *);
    int Tcp_listen(const char *, const char *, socklen_t *);
    int Udp_client(const char *, const char *, SA **, socklen_t *);
    int Udp_connect(const char *, const char *);
    int Udp_server(const char *, const char *, socklen_t *);
    ssize_t Write_fd(int, void *, size_t, int);
    int Writable_timeo(int, int); /* prototypes for our Unix wrapper functions: see {Sec errors} */
    void *Calloc(size_t, size_t);
    void Close(int);
    void Dup2(int, int);
    int Fcntl(int, int, int);
    void Gettimeofday(struct timeval *, void *);
    int Ioctl(int, int, void *);
    pid_t Fork(void);
    void *Malloc(size_t);
    int Mkstemp(char *);
    void *Mmap(void *, size_t, int, int, int, off_t);
    int Open(const char *, int, mode_t);
    void Pipe(int *fds);
    ssize_t Read(int, void *, size_t);
    void Sigaddset(sigset_t *, int);
    void Sigdelset(sigset_t *, int);
    void Sigemptyset(sigset_t *);
    void Sigfillset(sigset_t *);
    int Sigismember(const sigset_t *, int);
    void Sigpending(sigset_t *);
    void Sigprocmask(int, const sigset_t *, sigset_t *);
    char *Strdup(const char *);
    long Sysconf(int);
    void Sysctl(int *, u_int, void *, size_t *, void *, size_t);
    void Unlink(const char *);
    pid_t Wait(int *);
    pid_t Waitpid(pid_t, int *, int);
    void Write(int, void *, size_t); /* prototypes for our stdio wrapper functions: see {Sec errors} */
    void Fclose(FILE *);
    FILE *Fdopen(int, const char *);
    char *Fgets(char *, int, FILE *);
    FILE *Fopen(const char *, const char *);
    void Fputs(const char *, FILE *); /* prototypes for our socket wrapper functions: see {Sec errors} */
    int Accept(int, SA *, socklen_t *);
    void Bind(int, const SA *, socklen_t);
    void Connect(int, const SA *, socklen_t);
    void Getpeername(int, SA *, socklen_t *);
    void Getsockname(int, SA *, socklen_t *);
    void Getsockopt(int, int, int, void *, socklen_t *);
    #ifdef HAVE_INET6_RTH_INIT
    int Inet6_rth_space(int, int);
    void *Inet6_rth_init(void *, socklen_t, int, int);
    void Inet6_rth_add(void *, const struct in6_addr *);
    void Inet6_rth_reverse(const void *, void *);
    int Inet6_rth_segments(const void *);
    struct in6_addr *Inet6_rth_getaddr(const void *, int);
    #endif
    #ifdef HAVE_KQUEUE
    int Kqueue(void);
    int Kevent(int, const struct kevent *, int,
    struct kevent *, int, const struct timespec *);
    #endif
    void Listen(int, int);
    #ifdef HAVE_POLL
    int Poll(struct pollfd *, unsigned long, int);
    #endif
    ssize_t Readline(int, void *, size_t);
    ssize_t Readn(int, void *, size_t);
    ssize_t Recv(int, void *, size_t, int);
    ssize_t Recvfrom(int, void *, size_t, int, SA *, socklen_t *);
    ssize_t Recvmsg(int, struct msghdr *, int);
    int Select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
    void Send(int, const void *, size_t, int);
    void Sendto(int, const void *, size_t, int, const SA *, socklen_t);
    void Sendmsg(int, const struct msghdr *, int);
    void Setsockopt(int, int, int, const void *, socklen_t);
    void Shutdown(int, int);
    int Sockatmark(int);
    int Socket(int, int, int);
    void Socketpair(int, int, int, int *);
    void Writen(int, void *, size_t); void err_dump(const char *, ...);
    void err_msg(const char *, ...);
    void err_quit(const char *, ...);
    void err_ret(const char *, ...);
    void err_sys(const char *, ...); #endif /* __unp_h */

    新建一个apue.h,把下面这段粘贴进去

    /*
    * Our own header, to be included before all standard system headers.
    */
    #ifndef _APUE_H
    #define _APUE_H #define _POSIX_C_SOURCE 200809L #if defined(SOLARIS) /* Solaris 10 */
    #define _XOPEN_SOURCE 600
    #else
    #define _XOPEN_SOURCE 700
    #endif #include <sys/types.h> /* some systems still require this */
    #include <sys/stat.h>
    #include <sys/termios.h> /* for winsize */
    #if defined(MACOS) || !defined(TIOCGWINSZ)
    #include <sys/ioctl.h>
    #endif #include <stdio.h> /* for convenience */
    #include <stdlib.h> /* for convenience */
    #include <stddef.h> /* for offsetof */
    #include <string.h> /* for convenience */
    #include <unistd.h> /* for convenience */
    #include <signal.h> /* for SIG_ERR */ #define MAXLINE 4096 /* max line length */ /*
    * Default file access permissions for new files.
    */
    #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) /*
    * Default permissions for new directories.
    */
    #define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH) typedef void Sigfunc(int); /* for signal handlers */ #define min(a,b) ((a) < (b) ? (a) : (b))
    #define max(a,b) ((a) > (b) ? (a) : (b)) /*
    * Prototypes for our own functions.
    */
    char *path_alloc(size_t *); /* {Prog pathalloc} */
    long open_max(void); /* {Prog openmax} */ int set_cloexec(int); /* {Prog setfd} */
    void clr_fl(int, int);
    void set_fl(int, int); /* {Prog setfl} */ void pr_exit(int); /* {Prog prexit} */ void pr_mask(const char *); /* {Prog prmask} */
    Sigfunc *signal_intr(int, Sigfunc *); /* {Prog signal_intr_function} */ void daemonize(const char *); /* {Prog daemoninit} */ void sleep_us(unsigned int); /* {Ex sleepus} */
    ssize_t readn(int, void *, size_t); /* {Prog readn_writen} */
    ssize_t writen(int, const void *, size_t); /* {Prog readn_writen} */ int fd_pipe(int *); /* {Prog sock_fdpipe} */
    int recv_fd(int, ssize_t (*func)(int,
    const void *, size_t)); /* {Prog recvfd_sockets} */
    int send_fd(int, int); /* {Prog sendfd_sockets} */
    int send_err(int, int,
    const char *); /* {Prog senderr} */
    int serv_listen(const char *); /* {Prog servlisten_sockets} */
    int serv_accept(int, uid_t *); /* {Prog servaccept_sockets} */
    int cli_conn(const char *); /* {Prog cliconn_sockets} */
    int buf_args(char *, int (*func)(int,
    char **)); /* {Prog bufargs} */ int tty_cbreak(int); /* {Prog raw} */
    int tty_raw(int); /* {Prog raw} */
    int tty_reset(int); /* {Prog raw} */
    void tty_atexit(void); /* {Prog raw} */
    struct termios *tty_termios(void); /* {Prog raw} */ int ptym_open(char *, int); /* {Prog ptyopen} */
    int ptys_open(char *); /* {Prog ptyopen} */
    #ifdef TIOCGWINSZ
    pid_t pty_fork(int *, char *, int, const struct termios *,
    const struct winsize *); /* {Prog ptyfork} */
    #endif int lock_reg(int, int, int, off_t, int, off_t); /* {Prog lockreg} */ #define read_lock(fd, offset, whence, len) \
    lock_reg((fd), F_SETLK, F_RDLCK, (offset), (whence), (len))
    #define readw_lock(fd, offset, whence, len) \
    lock_reg((fd), F_SETLKW, F_RDLCK, (offset), (whence), (len))
    #define write_lock(fd, offset, whence, len) \
    lock_reg((fd), F_SETLK, F_WRLCK, (offset), (whence), (len))
    #define writew_lock(fd, offset, whence, len) \
    lock_reg((fd), F_SETLKW, F_WRLCK, (offset), (whence), (len))
    #define un_lock(fd, offset, whence, len) \
    lock_reg((fd), F_SETLK, F_UNLCK, (offset), (whence), (len)) pid_t lock_test(int, int, off_t, int, off_t); /* {Prog locktest} */ #define is_read_lockable(fd, offset, whence, len) \
    (lock_test((fd), F_RDLCK, (offset), (whence), (len)) == 0)
    #define is_write_lockable(fd, offset, whence, len) \
    (lock_test((fd), F_WRLCK, (offset), (whence), (len)) == 0) void err_msg(const char *, ...); /* {App misc_source} */
    void err_dump(const char *, ...) __attribute__((noreturn));
    void err_quit(const char *, ...) __attribute__((noreturn));
    void err_cont(int, const char *, ...);
    void err_exit(int, const char *, ...) __attribute__((noreturn));
    void err_ret(const char *, ...);
    void err_sys(const char *, ...) __attribute__((noreturn)); void log_msg(const char *, ...); /* {App misc_source} */
    void log_open(const char *, int, int);
    void log_quit(const char *, ...) __attribute__((noreturn));
    void log_ret(const char *, ...);
    void log_sys(const char *, ...) __attribute__((noreturn));
    void log_exit(int, const char *, ...) __attribute__((noreturn)); void TELL_WAIT(void); /* parent/child from {Sec race_conditions} */
    void TELL_PARENT(pid_t);
    void TELL_CHILD(pid_t);
    void WAIT_PARENT(void);
    void WAIT_CHILD(void);
    #include "myerr.c"
    #endif /* _APUE_H */

    再新建一个myerr.c,把下面内容填充进去

    #include "apue.h"
    #include <errno.h> /* for definition of errno */
    #include <stdarg.h> /* ISO C variable aruments */ static void err_doit(int, int, const char *, va_list); /*
    * Nonfatal error related to a system call.
    * Print a message and return.
    */
    void
    err_ret(const char *fmt, ...)
    {
    va_list ap; va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    } /*
    * Fatal error related to a system call.
    * Print a message and terminate.
    */
    void
    err_sys(const char *fmt, ...)
    {
    va_list ap; va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    exit(1);
    } /*
    * Nonfatal error unrelated to a system call.
    * Error code passed as explict parameter.
    * Print a message and return.
    */
    void
    err_cont(int error, const char *fmt, ...)
    {
    va_list ap; va_start(ap, fmt);
    err_doit(1, error, fmt, ap);
    va_end(ap);
    } /*
    * Fatal error unrelated to a system call.
    * Error code passed as explict parameter.
    * Print a message and terminate.
    */
    void
    err_exit(int error, const char *fmt, ...)
    {
    va_list ap; va_start(ap, fmt);
    err_doit(1, error, fmt, ap);
    va_end(ap);
    exit(1);
    } /*
    * Fatal error related to a system call.
    * Print a message, dump core, and terminate.
    */
    void
    err_dump(const char *fmt, ...)
    {
    va_list ap; va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    abort(); /* dump core and terminate */
    exit(1); /* shouldn't get here */
    } /*
    * Nonfatal error unrelated to a system call.
    * Print a message and return.
    */
    void
    err_msg(const char *fmt, ...)
    {
    va_list ap; va_start(ap, fmt);
    err_doit(0, 0, fmt, ap);
    va_end(ap);
    } /*
    * Fatal error unrelated to a system call.
    * Print a message and terminate.
    */
    void
    err_quit(const char *fmt, ...)
    {
    va_list ap; va_start(ap, fmt);
    err_doit(0, 0, fmt, ap);
    va_end(ap);
    exit(1);
    } /*
    * Print a message and return to caller.
    * Caller specifies "errnoflag".
    */
    static void
    err_doit(int errnoflag, int error, const char *fmt, va_list ap)
    {
    char buf[MAXLINE]; vsnprintf(buf, MAXLINE-1, fmt, ap);
    if (errnoflag)
    snprintf(buf+strlen(buf), MAXLINE-strlen(buf)-1, ": %s",
    strerror(error));
    strcat(buf, "\n");
    fflush(stdout); /* in case stdout and stderr are the same */
    fputs(buf, stderr);
    fflush(NULL); /* flushes all stdio output streams */
    }

然后编译就成功了

然后运行就失败了

解决方案:

sudo apt-get install xinetd
# sudo yum install xinetd
vi /etc/xinetd.d/daytime

disable = yes改成disable = no

service daytime
{
disable = no
type = INTERNA:L
id = daytime-stream
socket_type = stream
protocol = tcp
user = root
wait = no
}

接下来:

sudo service xinetd reload
netstat -a -t | grep daytime # 确认服务正在运行

如果不行,报错了,就看看这篇照着做肯定行https://www.cnblogs.com/yewandemty/p/5396391.html(一般centOS可能会报错,Ubuntu一般不会报错)

照着做完之后代码运行成功:

我运行的代码:

#include    "unp.h"  

int
main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr; if (argc != 2)
err_quit("usage: a.out <IPaddress>"); if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("socket error"); bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13); /* daytime server */
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
err_quit("inet_pton error for %s", argv[1]); if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
err_sys("connect error"); while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
if (n < 0)
err_sys("read error"); exit(0);
}

unp.h的安装以及第一个程序的运行的更多相关文章

  1. Java和eclipxe的安装以及第一个程序

    首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 注意事项:安装 ...

  2. [视频解说]Java(JDK的下载安装及第一个程序执行)

    (JDK的下载安装及第一个程序执行) 内容:Java JDK 的安装以及HelloWorld 程序的执行 欢迎童鞋们前往围观 http://v.youku.com/v_show/id_XODA3Mzk ...

  3. /var/run/yum.pid 已被锁定,PID 为 XXXX 的另一个程序正在运行。

    安装st-load时, 终端提示 “/var/run/yum.pid 已被锁定,PID 为 13908 的另一个程序正在运行.” 解决方法:直接在终端运行 rm -f /var/run/yum.pid ...

  4. Loadrunner11录制过程中报错:由于另一个程序正在运行中,此操作无法完成

    第一次安装LR11录制没有问题,第二次录制也没有问题,后面第二天录制就出现了如下截图的现象  报错内容:由于另一个程序正在运行中,此操作无法完成.请选择“切换到”来激活正在运行中的的程序,并更正问题 ...

  5. 运行yum时出现/var/run/yum.pid已被锁定,PID为xxxx的另一个程序正在运行的问题解决

    出现问题 [root@localhost ~]#yum update 已加载插件: fastestmirror,security /var/run/yum.pid已被锁定,PID为1610的另一个程序 ...

  6. Java(1)开发环境配置及第一个程序Hello World

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201468.html 博客主页:https://www.cnblogs.com/testero ...

  7. SpringBoot环境搭建及第一个程序运行(详细!)

    spring boot简介 spring boot框架抛弃了繁琐的xml配置过程,采用大量的默认配置简化我们的开发过程. 所以采用Spring boot可以非常容易和快速地创建基于Spring 框架的 ...

  8. C# Winform防止一个程序重复运行

    1: //在写一些服务型的软件的时候,你可能不希望一个操作系统里有两个副本在运行,这样也许会扰乱你的操作.这时,你就需要限制程序的副本.下面的这个方法,很简单的就可以实现上述功能. using Sys ...

  9. Web自动化——介绍与安装以及第一个web自动化程序(一)

    1. 为什么要做Web自动化测试 什么是web自动化测试 让程序代替人,去验证网页上功能的过程 web自动化测试与手工测试的比较 web自动化测试执行的测试用例是手工功能测试的子集 web自动化测试的 ...

  10. flask安装及第一个程序

    1.flask是一个轻量级的python web框架 ·1.Flask 依赖两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 套件 ·2.安装: # easy_install fla ...

随机推荐

  1. 通过AMDP调用HANA的PAL函数

    SAP预测分析库(SAP Predictive Analysis Library,PAL)是SAP HANA中的一项功能,它允许我们在SAP HANA SQLScript过程中执行分析算法. 基于AB ...

  2. linux打包压缩工具详解

    linux打包压缩工具详解 目录 linux打包压缩工具详解 1.linux文件压缩工具 1.1 compress命令详解 1.2 gzip命令详解 1.3 bzip2命令详解 1.4 xz命令详解 ...

  3. python教程8-页面爬虫

    python爬虫常用requests和beautifulSoup这2个第三方模块.需要先进行手动安装. requests负责下载页面数据,beautifulSoup负责解析页面标签. 关于beauti ...

  4. 扩展实现Unity协程的完整栈跟踪

    现如今Unity中的协程(Coroutine)方案已显得老旧,Unitask等异步方案可以做到异常捕获等yield关键字处理起来很麻烦的问题, 并且Unity官方也在开发一套异步方案,但对于临时加入到 ...

  5. 5GC 系统架构

    目录 文章目录 目录 前文列表 4G/5G 核心网对比 4G/5G 核心网融合架构 5GC 架构 AMF 功能 SMF 功能 NSSF 功能 UPF 功能 AF.PCF & NEF 功能 BS ...

  6. next-元数据创建、更新 SEO 优化

    在创建Next.js项目时,根页面会自动生成一个metadata对象,其中包含标题和描述等关键信息.每当页面被访问时,这个metadata对象会被读取并应用到HTML的默认配置中,确保页面的基本信息得 ...

  7. TS码流解析(一)TS Header

    有一些音视频初学者想要了解TS码流结构,但网上资料不全或者讲得不够清楚,使得学习过程变得异常艰难.这一篇内容将对TS码流结构做详尽解析,争取做到通俗易懂,成为最好的TS码流解析文章. 本篇TS码流解析 ...

  8. Visual Studio 智能代码插件:CodeGeeX

    前言 在软件开发领域,高效的编程助手一直是提升开发者效率和质量的关键.随着人工智能技术的不断发展,智能编程助手逐渐成为开发者们不可或缺的工具.其中,CodeGeeX作为一款专为Visual Studi ...

  9. 春松客服入驻Rainbond开源应用商店

    "做好开源客服系统" 春松客服是拥有坐席管理.渠道管理.机器人客服.数据分析.CRM 等功能于一身的新一代客服系统.将智能机器人与人工客服完美融合,同时整合了多种渠道,结合 CRM ...

  10. docker 监控数据整合

    安装docker #开启内核转发 echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf sysctl -p wget -O /etc/yum.repo ...