?? sock.h
字號:
/* * Wrapper functions for our own library functions. * Most are included in the source file for the function itself. */const char *Inet_ntop(int family, const void *addrptr, char *strptr, size_t len){ const char *ptr; if (strptr == NULL) /* check for old code */ err_quit("NULL 3rd argument to inet_ntop"); if ( (ptr = inet_ntop(family, addrptr, strptr, len)) == NULL) err_sys("inet_ntop error"); /* sets errno */ return(ptr);}voidInet_pton(int family, const char *strptr, void *addrptr){ int n; if ( (n = inet_pton(family, strptr, addrptr)) < 0) err_sys("inet_pton error for %s", strptr); /* errno set */ else if (n == 0) err_quit("inet_pton error for %s", strptr); /* errno not set */ /* nothing to return */}/* * Socket wrapper functions. * These could all go into separate files, so only the ones needed cause * the corresponding function to be added to the executable. If sockets * are a library (SVR4) this might make a difference (?), but if sockets * are in the kernel (BSD) it doesn't matter. * * These wrapper functions also use the same prototypes as POSIX.1g, * which might differ from many implementations (i.e., POSIX.1g specifies * the fourth argument to getsockopt() as "void *", not "char *"). * * If your system's headers are not correct [i.e., the Solaris 2.5 * <sys/socket.h> omits the "const" from the second argument to both * bind() and connect()], you'll get warnings of the form: *warning: passing arg 2 of `bind' discards `const' from pointer target type *warning: passing arg 2 of `connect' discards `const' from pointer target type */void *Calloc(size_t n, size_t size){ void *ptr; if ( (ptr = calloc(n, size)) == NULL) err_sys("calloc error"); return(ptr);}voidClose(int fd){ if (close(fd) == -1) err_sys("close error");}voidDup2(int fd1, int fd2){ if (dup2(fd1, fd2) == -1) err_sys("dup2 error");}intFcntl(int fd, int cmd, int arg){ int n; if ( (n = fcntl(fd, cmd, arg)) == -1) err_sys("fcntl error"); return(n);}voidGettimeofday(struct timeval *tv, void *foo){ if (gettimeofday(tv, foo) == -1) err_sys("gettimeofday error"); return;}intIoctl(int fd, int request, void *arg){ int n; if ( (n = ioctl(fd, request, arg)) == -1) err_sys("ioctl error"); return(n); /* streamio of I_LIST returns value */}pid_tFork(void){ pid_t pid; if ( (pid = fork()) == -1) err_sys("fork error"); return(pid);}void *Malloc(size_t size){ void *ptr; if ( (ptr = malloc(size)) == NULL) err_sys("malloc error"); return(ptr);}voidMktemp(char *template){ if (mkstemp(template) == -1 || template[0] == 0) err_quit("mkstemp error");}#include <sys/mman.h>void *Mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset){ void *ptr; if ( (ptr = mmap(addr, len, prot, flags, fd, offset)) == ((void *) -1)) err_sys("mmap error"); return(ptr);}intOpen(const char *pathname, int oflag, mode_t mode){ int fd; if ( (fd = open(pathname, oflag, mode)) == -1) err_sys("open error for %s", pathname); return(fd);}voidPipe(int *fds){ if (pipe(fds) < 0) err_sys("pipe error");}ssize_tRead(int fd, void *ptr, size_t nbytes){ ssize_t n; if ( (n = read(fd, ptr, nbytes)) == -1) err_sys("read error"); return(n);}voidSigaddset(sigset_t *set, int signo){ if (sigaddset(set, signo) == -1) err_sys("sigaddset error");}voidSigdelset(sigset_t *set, int signo){ if (sigdelset(set, signo) == -1) err_sys("sigdelset error");}voidSigemptyset(sigset_t *set){ if (sigemptyset(set) == -1) err_sys("sigemptyset error");}voidSigfillset(sigset_t *set){ if (sigfillset(set) == -1) err_sys("sigfillset error");}intSigismember(const sigset_t *set, int signo){ int n; if ( (n = sigismember(set, signo)) == -1) err_sys("sigismember error"); return(n);}voidSigpending(sigset_t *set){ if (sigpending(set) == -1) err_sys("sigpending error");}voidSigprocmask(int how, const sigset_t *set, sigset_t *oset){ if (sigprocmask(how, set, oset) == -1) err_sys("sigprocmask error");}char *Strdup(const char *str){ char *ptr; if ( (ptr = strdup(str)) == NULL) err_sys("strdup error"); return(ptr);}longSysconf(int name){ long val; errno = 0; /* in case sysconf() does not change this */ if ( (val = sysconf(name)) == -1) err_sys("sysconf error"); return(val);}#ifdef HAVE_SYS_SYSCTL_HvoidSysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen){ if (sysctl(name, namelen, oldp, oldlenp, newp, newlen) == -1) err_sys("sysctl error");}#endifvoidUnlink(const char *pathname){ if (unlink(pathname) == -1) err_sys("unlink error for %s", pathname);}pid_tWait(int *iptr){ pid_t pid; if ( (pid = wait(iptr)) == -1) err_sys("wait error"); return(pid);}pid_tWaitpid(pid_t pid, int *iptr, int options){ pid_t retpid; if ( (retpid = waitpid(pid, iptr, options)) == -1) err_sys("waitpid error"); return(retpid);}voidWrite(int fd, void *ptr, size_t nbytes){ if (write(fd, ptr, nbytes) != nbytes) err_sys("write error");}/* * Standard I/O wrapper functions. */voidFclose(FILE *fp){ if (fclose(fp) != 0) err_sys("fclose error");}FILE *Fdopen(int fd, const char *type){ FILE *fp; if ( (fp = fdopen(fd, type)) == NULL) err_sys("fdopen error"); return(fp);}char *Fgets(char *ptr, int n, FILE *stream){ char *rptr; if ( (rptr = fgets(ptr, n, stream)) == NULL && ferror(stream)) err_sys("fgets error"); return (rptr);}FILE *Fopen(const char *filename, const char *mode){ FILE *fp; if ( (fp = fopen(filename, mode)) == NULL) err_sys("fopen error"); return(fp);}voidFputs(const char *ptr, FILE *stream){ if (fputs(ptr, stream) == EOF) err_sys("fputs error");}/* include tcp_connect */inttcp_connect(const char *host, const char *serv){ int sockfd, n; struct addrinfo hints, *res, *ressave; bzero(&hints, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0) err_quit("tcp_connect error for %s, %s", host, serv); ressave = res; do { sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (sockfd < 0) continue; /* ignore this one */ if (connect(sockfd, res->ai_addr, res->ai_addrlen) == 0) break; /* success */ Close(sockfd); /* ignore this one */ } while ( (res = res->ai_next) != NULL); if (res == NULL) /* errno set from final connect() */ err_sys("tcp_connect error for %s, %s", host, serv); freeaddrinfo(ressave); return(sockfd);}/* end tcp_connect *//* * We place the wrapper function here, not in wraplib.c, because some * XTI programs need to include wraplib.c, and it also defines * a Tcp_connect() function. */intTcp_connect(const char *host, const char *serv){ return(tcp_connect(host, serv));}/* include tcp_listen */inttcp_listen(const char *host, const char *serv, socklen_t *addrlenp){ int listenfd, n; const int on = 1; struct addrinfo hints, *res, *ressave; bzero(&hints, sizeof(struct addrinfo)); hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0) err_quit("tcp_listen error for %s, %s", host, serv); ressave = res; do { listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (listenfd < 0) continue; /* error, try next one */ Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0) break; /* success */ Close(listenfd); /* bind error, close and try next one */ } while ( (res = res->ai_next) != NULL); if (res == NULL) /* errno from final socket() or bind() */ err_sys("tcp_listen error for %s, %s", host, serv); Listen(listenfd, LISTENQ); if (addrlenp) *addrlenp = res->ai_addrlen; /* return size of protocol address */ freeaddrinfo(ressave); return(listenfd);}/* end tcp_listen *//* * We place the wrapper function here, not in wraplib.c, because some * XTI programs need to include wraplib.c, and it also defines * a Tcp_listen() function. */intTcp_listen(const char *host, const char *serv, socklen_t *addrlenp){ return(tcp_listen(host, serv, addrlenp));}/* include udp_client */intudp_client(const char *host, const char *serv, void **saptr, socklen_t *lenp){ int sockfd, n; struct addrinfo hints, *res, *ressave; bzero(&hints, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0) err_quit("udp_client error for %s, %s", host, serv); ressave = res; do { sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (sockfd >= 0) break; /* success */ } while ( (res = res->ai_next) != NULL); if (res == NULL) /* errno set from final socket() */ err_sys("udp_client error for %s, %s", host, serv); *saptr = Malloc(res->ai_addrlen); memcpy(*saptr, res->ai_addr, res->ai_addrlen); *lenp = res->ai_addrlen; freeaddrinfo(ressave); return(sockfd);}/* end udp_client */intUdp_client(const char *host, const char *serv, void **saptr, socklen_t *lenptr){ return(udp_client(host, serv, saptr, lenptr));}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -