UINX 网络编程学习(2)--简单的时间获取客户程序
2012-03-20 14:13
501 查看
#include "unp.h" #define SER_IP "127.0.0.1" 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"); // printf("socket error"); // else // printf("socket success"); 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 (inet_pton(AF_INET, SER_IP, &servaddr.sin_addr) <= 0) err_quit("inet_pton error for %s", SER_IP); // printf("inet_pton error"); if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)//#define SA struct sockaddr err_sys("connect error"); // printf("connect error"); while ( (n = read(sockfd, recvline, MAXLINE)) > 0) { recvline = 0; /* null terminate */ if (fputs(recvline, stdout) == EOF) err_sys("fputs error"); // printf("fputs error"); } if (n < 0) err_sys("read error"); // printf("read error"); exit(0); }
针对上述程序的一些解析:
sockfd = socket(AF_INET, SOCK_STREAM, 0)
创建一个套接字,返回值为一个小的整数描述符,该描述符标识该套接字。
bzero(&servaddr, sizeof(servaddr));
servaddr由来定义structsockaddr_in servaddr;
为服务器端套接字信息,用bzero清零,bzero不是ANSI C函数,宏替换了或者可以用memset来实现。
/* Define bzero() as a macro if it's not instandard C library. */
#ifndef HAVE_BZERO
#define bzero(ptr,n) memset(ptr, 0, n)
/* $$.If bzero$$ */
/* $$.If memset$$ */
#endif
清零后,绑定服务端信息,将服务器端信息写到servadrr中。
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_ptonerror for %s", argv[1]);
if(inet_pton(AF_INET, SER_IP, &servaddr.sin_addr) <= 0)//绑定地址信息
connect(sockfd, (SA *) &servaddr,sizeof(servaddr)
用建立的套接字来连接服务器端的套接字。
while ( (n = read(sockfd, recvline,MAXLINE)) > 0) {
recvline
= 0; /* null terminate */
if(fputs(recvline, stdout) == EOF)
从标识为sockfd的套接字读取信息,并调用fputs将信息写到stdout流。即屏幕。
Unix网络编程这本书中,unp.h,config.h分别为:
//unp.h
/* include unph */ /* Our own header. Tabs are set for 4 spaces, not 8 */ #ifndef __unp_h #define __unp_h //#include "../config.h" /* configuration options for current OS */ // /* "../config.h" is generated by configure */ #include "config.h"//changed by fupeng /* 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 */ #include <sys/time.h> /* timeval{} for select() */ #include <time.h> /* timespec{} for pselect() */ #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 # include <sys/sysctl.h> #endif #ifdef HAVE_POLL_H # include <poll.h> /* for convenience */ #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 //commented by fupeng #ifdef HAVE_PTHREAD_H # include <pthread.h> #endif //#ifdef HAVE_NET_IF_DL_H //# include <net/if_dl.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.1g names are quite 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 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 /* $$.Ic CMSG_LEN$$ */ #define CMSG_LEN(size) (sizeof(struct cmsghdr) + (size)) #endif #ifndef CMSG_SPACE /* $$.Ic CMSG_SPACE$$ */ #define CMSG_SPACE(size) (sizeof(struct cmsghdr) + (size)) #endif /* Posix.1g 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.1g renames "Unix domain" as "local IPC". But 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.1g 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 MAXSOCKADDR 128 /* max socket address structure size */ #define BUFFSIZE 8192 /* buffer size for reads and writes */ /* Define some port number that can be used for client-servers */ #define SERV_PORT 9877 /* TCP and UDP client-servers */ #define SERV_PORT_STR "9877" /* TCP and UDP client-servers */ #define UNIXSTR_PATH "/tmp/unix.str" /* Unix domain stream cli-serv */ #define UNIXDG_PATH "/tmp/unix.dg" /* Unix domain datagram cli-serv */ /* $$.ix [LISTENQ]~constant,~definition~of$$ */ /* $$.ix [MAXLINE]~constant,~definition~of$$ */ /* $$.ix [MAXSOCKADDR]~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 type casts of pointer arguments */ #define SA struct sockaddr #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); void 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 *, int); u_char *inet_srcrt_init(void); void inet_srcrt_print(u_char *, int); 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 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 *, void **, 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 unsigned short in_cksum(unsigned short *, 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_ISFDTYPE_PROTO int isfdtype(int, int); #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 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 *, void **, 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 *); int Isfdtype(int, int); 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 *fmt, ...);//changed by fupeng #endif /* __unp_h */
//config.h
/* config.h. Generated automatically by configure. */ /* config.h.in. Generated automatically from configure.in by autoheader. */ /* CPU, vendor, and operating system */ #define CPU_VENDOR_OS "sparc64-unknown-freebsd5.1" /* Define if <netdb.h> defines struct addrinfo */ #define HAVE_ADDRINFO_STRUCT 1 /* Define if you have the <arpa/inet.h> header file. */ #define HAVE_ARPA_INET_H 1 /* Define if you have the `bzero' function. */ #define HAVE_BZERO 1 /* Define if the /dev/streams/xtiso/tcp device exists */ /* #undef HAVE_DEV_STREAMS_XTISO_TCP */ /* Define if the /dev/tcp device exists */ /* #undef HAVE_DEV_TCP */ /* Define if the /dev/xti/tcp device exists */ /* #undef HAVE_DEV_XTI_TCP */ /* Define if you have the <errno.h> header file. */ #define HAVE_ERRNO_H 1 /* Define if you have the <fcntl.h> header file. */ #define HAVE_FCNTL_H 1 /* Define if you have the `getaddrinfo' function. */ #define HAVE_GETADDRINFO 1 /* define if getaddrinfo prototype is in <netdb.h> */ #define HAVE_GETADDRINFO_PROTO 1 /* Define if you have the `gethostbyname2' function. */ #define HAVE_GETHOSTBYNAME2 1 /* Define if you have the `gethostbyname_r' function. */ /* #undef HAVE_GETHOSTBYNAME_R */ /* Define if you have the `gethostname' function. */ #define HAVE_GETHOSTNAME 1 /* define if gethostname prototype is in <unistd.h> */ #define HAVE_GETHOSTNAME_PROTO 1 /* Define if you have the `getnameinfo' function. */ #define HAVE_GETNAMEINFO 1 /* define if getnameinfo prototype is in <netdb.h> */ #define HAVE_GETNAMEINFO_PROTO 1 /* define if getrusage prototype is in <sys/resource.h> */ #define HAVE_GETRUSAGE_PROTO 1 /* Define if you have the `hstrerror' function. */ #define HAVE_HSTRERROR 1 /* define if hstrerror prototype is in <netdb.h> */ #define HAVE_HSTRERROR_PROTO 1 /* Define if <net/if.h> defines struct if_nameindex */ #define HAVE_IF_NAMEINDEX_STRUCT 1 /* Define if you have the `if_nametoindex' function. */ #define HAVE_IF_NAMETOINDEX 1 /* define if if_nametoindex prototype is in <net/if.h> */ #define HAVE_IF_NAMETOINDEX_PROTO 1 /* Define if you have the `inet_aton' function. */ #define HAVE_INET_ATON 1 /* define if inet_aton prototype is in <arpa/inet.h> */ #define HAVE_INET_ATON_PROTO 1 /* Define if you have the `inet_pton' function. */ #define HAVE_INET_PTON 1 /* define if inet_pton prototype is in <arpa/inet.h> */ #define HAVE_INET_PTON_PROTO 1 /* Define if you have the `kevent' function. */ #define HAVE_KEVENT 1 /* Define if you have the `kqueue' function. */ #define HAVE_KQUEUE 1 /* Define if you have the `nsl' library (-lnsl). */ /* #undef HAVE_LIBNSL */ /* Define if you have the `pthread' library (-lpthread). */ /* #undef HAVE_LIBPTHREAD */ /* Define if you have the `pthreads' library (-lpthreads). */ /* #undef HAVE_LIBPTHREADS */ /* Define if you have the `resolv' library (-lresolv). */ /* #undef HAVE_LIBRESOLV */ /* Define if you have the `xti' library (-lxti). */ /* #undef HAVE_LIBXTI */ /* Define if you have the `mkstemp' function. */ #define HAVE_MKSTEMP 1 /* define if struct msghdr contains the msg_control element */ #define HAVE_MSGHDR_MSG_CONTROL 1 /* Define if you have the <netconfig.h> header file. */ #define HAVE_NETCONFIG_H 1 /* Define if you have the <netdb.h> header file. */ #define HAVE_NETDB_H 1 /* Define if you have the <netdir.h> header file. */ /* #undef HAVE_NETDIR_H */ /* Define if you have the <netinet/in.h> header file. */ #define HAVE_NETINET_IN_H 1 /* Define if you have the <net/if_dl.h> header file. */ #define HAVE_NET_IF_DL_H 1 /* Define if you have the `poll' function. */ #define HAVE_POLL 1 /* Define if you have the <poll.h> header file. */ #define HAVE_POLL_H 1 /* Define if you have the `pselect' function. */ #define HAVE_PSELECT 1 /* define if pselect prototype is in <sys/stat.h> */ #define HAVE_PSELECT_PROTO 1 /* Define if you have the <pthread.h> header file. */ #define HAVE_PTHREAD_H 1 /* Define if you have the <signal.h> header file. */ #define HAVE_SIGNAL_H 1 /* Define if you have the `snprintf' function. */ #define HAVE_SNPRINTF 1 /* define if snprintf prototype is in <stdio.h> */ #define HAVE_SNPRINTF_PROTO 1 /* Define if <net/if_dl.h> defines struct sockaddr_dl */ #define HAVE_SOCKADDR_DL_STRUCT 1 /* define if socket address structures have length fields */ #define HAVE_SOCKADDR_SA_LEN 1 /* Define if you have the `sockatmark' function. */ #define HAVE_SOCKATMARK 1 /* define if sockatmark prototype is in <sys/socket.h> */ #define HAVE_SOCKATMARK_PROTO 1 /* Define if you have the <stdio.h> header file. */ #define HAVE_STDIO_H 1 /* Define if you have the <stdlib.h> header file. */ #define HAVE_STDLIB_H 1 /* Define if you have the <strings.h> header file. */ #define HAVE_STRINGS_H 1 /* Define if you have the <string.h> header file. */ #define HAVE_STRING_H 1 /* Define if you have the <stropts.h> header file. */ /* #undef HAVE_STROPTS_H */ /* Define if `ifr_mtu' is member of `struct ifreq'. */ #define HAVE_STRUCT_IFREQ_IFR_MTU 1 /* Define if the system has the type `struct sockaddr_storage'. */ #define HAVE_STRUCT_SOCKADDR_STORAGE 1 /* Define if you have the <sys/event.h> header file. */ #define HAVE_SYS_EVENT_H 1 /* Define if you have the <sys/filio.h> header file. */ #define HAVE_SYS_FILIO_H 1 /* Define if you have the <sys/ioctl.h> header file. */ #define HAVE_SYS_IOCTL_H 1 /* Define if you have the <sys/select.h> header file. */ #define HAVE_SYS_SELECT_H 1 /* Define if you have the <sys/socket.h> header file. */ #define HAVE_SYS_SOCKET_H 1 /* Define if you have the <sys/sockio.h> header file. */ #define HAVE_SYS_SOCKIO_H 1 /* Define if you have the <sys/stat.h> header file. */ #define HAVE_SYS_STAT_H 1 /* Define if you have the <sys/sysctl.h> header file. */ #define HAVE_SYS_SYSCTL_H 1 /* Define if you have the <sys/time.h> header file. */ #define HAVE_SYS_TIME_H 1 /* Define if you have the <sys/types.h> header file. */ #define HAVE_SYS_TYPES_H 1 /* Define if you have the <sys/uio.h> header file. */ #define HAVE_SYS_UIO_H 1 /* Define if you have the <sys/un.h> header file. */ #define HAVE_SYS_UN_H 1 /* Define if you have the <sys/wait.h> header file. */ #define HAVE_SYS_WAIT_H 1 /* Define if <time.h> defines struct timespec */ #define HAVE_TIMESPEC_STRUCT 1 /* Define if you have the <time.h> header file. */ #define HAVE_TIME_H 1 /* Define if you have the <unistd.h> header file. */ #define HAVE_UNISTD_H 1 /* Define if you have the `vsnprintf' function. */ #define HAVE_VSNPRINTF 1 /* Define if you have the <xti.h> header file. */ /* #undef HAVE_XTI_H */ /* Define if you have the <xti_inet.h> header file. */ /* #undef HAVE_XTI_INET_H */ /* Define if the system supports IPv4 */ #define IPV4 1 /* Define if the system supports IPv6 */ #define IPV6 1 /* Define if the system supports IPv4 */ #define IPv4 1 /* Define if the system supports IPv6 */ #define IPv6 1 /* Define if the system supports IP Multicast */ #define MCAST 1 /* the size of the sa_family field in a socket address structure */ /* #undef SA_FAMILY_T */ /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you can safely include both <sys/time.h> and <time.h>. */ #define TIME_WITH_SYS_TIME 1 /* Define if the system supports UNIX domain sockets */ #define UNIXDOMAIN 1 /* Define if the system supports UNIX domain sockets */ #define UNIXdomain 1 /* 16 bit signed type */ /* #undef int16_t */ /* 32 bit signed type */ /* #undef int32_t */ /* the type of the sa_family struct element */ /* #undef sa_family_t */ /* unsigned integer type of the result of the sizeof operator */ /* #undef size_t */ /* a type appropriate for address */ /* #undef socklen_t */ /* define to __ss_family if sockaddr_storage has that instead of ss_family */ /* #undef ss_family */ /* a signed type appropriate for a count of bytes or an error indication */ /* #undef ssize_t */ /* scalar type */ #define t_scalar_t int32_t /* unsigned scalar type */ #define t_uscalar_t uint32_t /* 16 bit unsigned type */ /* #undef uint16_t */ /* 32 bit unsigned type */ /* #undef uint32_t */ /* 8-bit unsigned type */ /* #undef uint8_t */
//unp.c,定义了err_quit等函数。
#include <errno.h> /* for definition of errno */ #include <stdarg.h> /* ANSI C header file */ //#include "ourhdr.h" #include "unp.h" static void err_doit(int, const char *, va_list); char *pname = NULL; /* caller can set this from argv[0] */ /* Nonfatal error related to a system call. * Print a message and return. */ void /* $f err_ret $ */ err_ret(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(1, fmt, ap); va_end(ap); return; } /* Fatal error related to a system call. * Print a message and terminate. */ void /* $f err_sys $ */ err_sys(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(1, fmt, ap); va_end(ap); exit(1); } /* Fatal error related to a system call. * Print a message, dump core, and terminate. */ void /* $f err_dump $ */ err_dump(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(1, 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 /* $f err_msg $ */ err_msg(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(0, fmt, ap); va_end(ap); return; } /* Fatal error unrelated to a system call. * Print a message and terminate. */ void /* $f err_quit $ */ err_quit(const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(0, fmt, ap); va_end(ap); exit(1); } /* Print a message and return to caller. * Caller specifies "errnoflag". */ static void err_doit(int errnoflag, const char *fmt, va_list ap) { int errno_save; char buf[MAXLINE]; errno_save = errno; /* value caller might want printed */ vsprintf(buf, fmt, ap); if (errnoflag) sprintf(buf+strlen(buf), ": %s", strerror(errno_save)); strcat(buf, "\n"); fflush(stdout); /* in case stdout and stderr are the same */ fputs(buf, stderr); fflush(stderr); /* SunOS 4.1.* doesn't grok NULL argument */ return; }
fputs的用法:
fputs
function<cstdio>
int fputs ( const char * str, FILE * stream );Write string to stream
Writes the string pointed by str to the stream.
The function begins copying from the address specified (str) until it reaches the terminating null character ('\0'). This final null-character is not copied to the stream.
相关文章推荐
- 1.2 一个简单的时间获取客户程序
- 一个简单的时间获取客户程序
- UNIX网络编程 -- -- 一个简单的时间获取客户程序
- UNIX网络编程1.5一个简单的时间获取服务器程序1.6客户服务器程序索引表
- 简介(1)-概述、一个简单的时间获取客户程序
- 1.简介 1.2简单的时间获取客户程序
- 读书笔记之 简单时间获取客户/服务程序
- TCP的时间获取客户程序和时间获取服务器程序
- Unix网络编程:关于编译并测试TCP时间获取的客户程序
- Unix网络编程:从入门到放弃——一个简单的时间获取程序
- 【unix网络编程】4-11显示客户IP地址和端口号的时间获取服务程序
- 一个简单的TCP客户端时间获取程序
- 【Linux学习】 写一个简单的Makefile编译源码获取当前系统时间
- UNIX网络编程笔记(2):一个简单的时间获取程序
- Unix网络编程(卷一)-第一个简单的时间获取程序
- python最简单的小程序-计算行车时间-学习笔记6
- 学习 UNIX网络编程卷1:套接字 笔记1-实现一个简单的回射客户服务器程序
- iPhone网络编程初体验-简单的聊天程序(适合新手学习客户端服务器交互)
- unix网络基础-TCP时间获取客户程序
- C++中简单的获取时间程序