UINX 網路程式設計學習(2)--簡單的時間獲取客戶程式
#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[n] = 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[n]= 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
<cstdio>
int fputs ( const char * str, FILE * stream );
Write string to 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.
相關文章
- UNIX網路程式設計學習(3)--簡單時間獲取伺服器程式程式設計伺服器
- javascript獲取訪客停留時間程式碼JavaScript
- Linux程式設計(獲取系統時間)Linux程式設計
- Linux網路程式設計之socket簡單通訊--客戶端程式碼Linux程式設計客戶端
- Windows網路程式設計附書程式碼(簡單的伺服器與客戶端)Windows程式設計伺服器客戶端
- 風變程式設計,讓程式設計學習更簡單!程式設計
- 第四篇:一對經典的時間獲取客戶/伺服器程式伺服器
- UNIX網路程式設計學習(18)--UDP回射(伺服器+客戶端)程式程式設計UDP伺服器客戶端
- 系統程式設計-網路-tcp客戶端伺服器程式設計模型(續)、連線斷開、獲取連線狀態場景程式設計TCP客戶端伺服器模型
- Java 獲取本地時間與網路時間Java
- C#—獲取網路時間C#
- 程式設計師程式設計時的簡單方法與技巧程式設計師
- python獲取網路時間和本地時間Python
- 開啟電腦就能學習,風變程式設計讓學習程式設計更簡單程式設計
- Qt 獲取程式編譯時間QT編譯
- js獲取北京時間程式碼JS
- 當程式設計師遇上極品客戶的時候程式設計師
- .Net程式設計師安卓學習之路2:訪問網路API程式設計師安卓API
- 程式設計師的數學基礎課-黃申-極客時間程式設計師
- javascript獲取本地時間日期程式碼JavaScript
- 用Codecademy學習程式設計,簡單又有趣程式設計
- 簡單學懂鏈式程式設計程式設計
- 程式設計師如何獲取新程式設計技能程式設計師
- 《程式設計時間簡史系列》JavaScript 模組化的歷史程式程式設計JavaScript
- UNIX網路程式設計 卷2:程式間通訊程式設計
- iOS中獲取當前時間與簡單的處理iOS
- UNIX網路程式設計學習(11)--分析TCP回射服務+客戶程式:正常啟動與正常終止程式設計TCP
- 客戶端Cookie中文程式設計 (轉)客戶端Cookie程式設計
- 學習 WCF (3)--開發WCF客戶程式
- java程式設計師3個月業餘時間學習 大資料路徑Java程式設計師大資料
- 簡單程式的時間複雜度分析時間複雜度
- Java學習十六—掌握註解:讓程式設計更簡單Java程式設計
- 實時獲取當前時間程式碼例項
- 程式設計師獲取程式設計靈感的 10 種方式程式設計師
- 程式設計師獲取新程式設計技能的5個技巧?程式設計師
- 前端中的簡單程式設計題-陣列(2)前端程式設計陣列
- 最簡單的網路圖片的爬取 --Pyhon網路爬蟲與資訊獲取爬蟲
- linux網路程式設計之用socket實現簡單客戶端和服務端的通訊(基於TCP)Linux程式設計客戶端服務端TCP