unp.h
unp.h
#ifndef _UNP_H_
#define _UNP_H_
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <signal.h>
#include <string.h> /* for strerror */
#include <sys/wait.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#define MAXLINE 4096
#define SERV_PORT 6666
typedef void Sigfunc(int);
#define max(a,b) a>b?a:b
ssize_t readn(int fd,void *ptr,size_t n);
ssize_t writen(int fd,const void *ptr,size_t n);
ssize_t Read(int fd,void *buff,size_t n);
void Write(int fd,const void *buff,size_t n);
char *Fgets(char *buff,int nbytes,FILE *fp);
int Fputs(const char *str,FILE *fp);
void Close(int fd);
void err_quit(char *fmt,...);
int Socket(int family,int type,int protocol);
void Connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen);
void Bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);
void Listen(int sockfd,int backlog);
int Accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen);
int Fork();
Sigfunc *Signal(int signo,Sigfunc *func);
int Select(int maxfdp1,fd_set *readsex,fd_set *writeset,fd_set *exceptset,
struct timeval *timeout);
char *sock_ntop(const struct sockaddr *sockaddr, socklen_t addrlen);
#endif
unp.c
#include "unp.h"
ssize_t readn(int fd,void *ptr,size_t n){
size_t nleft;
ssize_t nread;
nleft=n;
while(nleft > 0){
if((nread=read(fd,ptr,nleft)) <0){
if(nleft == n)
return -1;
else
break;
}else if(nread == 0)
break;
nleft -= nread;
ptr += nread;
}
return(n-nleft);
}
ssize_t writen(int fd,const void *ptr,size_t n){
size_t nleft;
ssize_t nwritten;
nleft=n;
while(nleft > 0){
if((nwritten=write(fd,buff,nleft)) < 0){
if(nleft == n)
return -1;
else
break;
}else if(nwritten == 0)
break;
nleft -= nwritten;
ptr += nwritten;
}
return(n-nleft);
}
ssize_t Read(int fd,void *buff,size_t n){
int nread;
if((nread=read(fd,buff,n)) < 0)
err_quit("read error");
return nread;
}
void Write(int fd,const void *buff,size_t n){
if(write(fd,buff,n) != n)
err_quit("write error");
}
char *Fgets(char *buff,int nbytes,FILE *fp){
char *ptr=fgets(buff,nbytes,fp);
if(ptr==NULL && ferror(fp))
err_quit("fgets error");
return ptr;
}
int Fputs(const char *str,FILE *fp){
int ret=fputs(str,fp);
if(ret == EOF)
err_quit("fputs error");
return ret;
}
void Close(int fd){
if(close(fd)<0)
err_quit("close error");
}
void err_quit(char *fmt,...){
int errno_save=errno;
va_list va;
va_start(va,fmt);
vfprintf(stderr,fmt,va);
if(errno_save != 0)
fprintf(stderr," :%s",strerror(errno_save));
fprintf(stderr,"\n");
va_end(va);
exit(0);
}
int Socket(int family,int type,int protocol){
int sockfd=socket(family,type,protocol);
if(sockfd == -1)
err_quit("socket error");
return sockfd;
}
void Connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen){
if(connect(sockfd,servaddr,addrlen) == -1)
err_quit("connect error");
}
void Bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen){
if(bind(sockfd,myaddr,addrlen) == -1)
err_quit("bind error");
}
void Listen(int sockfd,int backlog){
if(listen(sockfd,backlog) == -1)
err_quit("listen error");
}
int Accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen){
int connfd=accept(sockfd,cliaddr,addrlen);
if(connfd < 0)
err_quit("accept error");
return connfd;
}
int Fork(){
pid_t pid=fork();
if(pid < 0)
err_quit("fork error");
return pid;
}
Sigfunc *Signal(int signo,Sigfunc *func){
Sigfunc *sigfunc=signal(signo,func);
if(sigfunc == SIG_ERR)
err_quit("signal error");
return sigfunc;
}
int Select(int maxfdp1,fd_set *readsex,fd_set *writeset,fd_set *exceptset,
struct timeval *timeout){
int ret;
if((ret=select(maxfdp1,readsex,writeset,exceptset,timeout)) < 0)
err_quit("select error");
return ret;
}
char *sock_ntop(const struct sockaddr *sa, socklen_t addrlen){
char portstr[8];
static char str[128];
switch(sa->sa_family){
case AF_INET:{
struct sockaddr_in *sin=(struct sockaddr_in *)sa;
if(inet_ntop(AF_INET,&sin->sin_addr,str,sizeof(str)) == NULL)
return(NULL);
if(ntohs(sin->sin_port) != 0){
snprintf(portstr,sizeof(portstr),":%d",
ntohs(sin->sin_port));
strcat(str,portstr);
}
return(str);
}
case AF_INET6:{
struct sockaddr_in6 *sin=(struct sockaddr_in6 *)sa;
if(inet_ntop(AF_INET6,&sin->sin6_addr,str,sizeof(str)) == NULL)
return(NULL);
if(ntohs(sin->sin6_port) != 0){
snprintf(portstr,sizeof(portstr),":%d",
ntohs(sin->sin6_port));
strcat(str,portstr);
}
return(str);
}
default:
printf("unknown sockaddr family\n");
break;
}
}
unp.h的更多相关文章
- Unix NetWork Programming(unix环境编程)——环境搭建(解决unp.h等源码编译问题)
此配置实例亲测成功,共勉,有问题大家留言. 环境:VMware 10 + unbuntu 14.04 为了unix进行网络编程,编程第一个unix程序时遇到的问题,不能包含unp.h文件,这个感觉和a ...
- 《UNIX网络编程(第3版)》unp.h等源码文件的编译安装
操作系统:Mac OS X 10.11.5 1.下载书中的源代码:点击下载 2.切换到解压后的目录 unpv13e,先查看下 README,依次执行: ./configure cd lib make ...
- 【转】【Raspberry Pi】Unix NetWork Programming:配置unp.h头文件环境
一.初衷 近期正在做网络计算编程的作业.要求平台为unix/linux,想着Raspberry Pi装的Debian系统也是Linux改的,也应该能够勉强用着,所以就用它来做作业了! 二.说明 先把环 ...
- 【转】Unix NetWork Programming——环境搭建(解决unp.h等源码编译问题)
下面开始用简单但典型的客户端和服务器端程序说明如何进行网络编程.这一小节讲的是客户端,一个用来连接并读取服务器发送来的时间的客户端. 这里涉及到了编写代码,因此要 搭建unix网络编程环境 unix系 ...
- Unix网络编程 -- ubuntu下搭建编译环境( 解决unp.h 编译等问题)
1.安装编译器,安装build-essential sudo apt-get install build-essential 2.下载本书的头文件 下载unpv13e http://ishare.i ...
- UNIX网络编程之旅-配置unp.h头文件环境
最近在学习Unix网络编程(UNP),书中steven在处理网络编程时只用了一个#include “unp.h” 相当有个性并且也很便捷 于是我把第三版的源代码编译实现了这个过程,算是一种个性化的开 ...
- unix网络编程-配置unp.h头文件
第一步进入:www.unpbook.com,下载unp的随书代码.新建一个目录,将压缩包拷贝到这一目录下面,然后将压缩包直接解压:tar -zxvf 压缩包名.tar.gz 完成上一步后,进入到un ...
- 16.unix网络编程一卷 unp.h
unix网络编程 --ubuntu下建立编译环境 1.安装编译器,安装build-essential sudo apt-get install build-essential 2.下载本书的头文件 下 ...
- UNP环境配置
最近在学习<UNIX网络编程>,书上将常用的头文件都放在unp.h里,需要自己编译一下代码搭建环境. UNP环境配置过程 下载源码 http://www.unpbook.com/src.h ...
随机推荐
- Flex 仿Winxp左侧菜单
呆毛放出,源码暂时不能公布,一直比较喜欢winxp的左侧菜单样式,以前也用xslt实现过,但总是达不到完美,没想到FLex轻松做到了这一点,几乎和winxp一模一样.
- Linux操作系统下三种配置环境变量的方法——转载
来源:赛迪网 作者:millio 现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 1.修改/e ...
- 输出1——n的排列(深度优先搜索)
样例输入: 3 样例输出: 123132213231312321 #include <stdio.h> int n; void dfs(int step,int* a,int* book) ...
- [vsftp]500 OOPS: cannot change directory
这个报错需要检查 1./etc/passwd 用户的主目录 2./etc/vsftpd/vuser_conf 下每个用户的local_root 3.每个用户目录给ftpuser加上rwx权限,一定要有 ...
- mysql中字符集和校对规则
首先,明确一下字符集和校对规则的概念: 字符集(charset):是一套符号和编码 校对规则(collation):是在字符集内用于比较字符的一套规则,比如有的规则区分大小写,有的则无视 ...
- 二叉树删除 lisp
;;; From ANSI Common Lisp ; If you have questions or comments about this code, or you want; somethin ...
- qq 登录 cordova插件
1.下载open-sdk.jar文件和mta_sdk_x.x.x.jar文件拷贝到libs(或lib)目录下这个链接 很容易的把环境配置好http://wiki.connect.qq.com/%E5% ...
- ionic ngcordova camera
拍照是經常用到的,所以記錄一下 拍照的代碼... 1. ionic start camera blankcd camera ionic platform add ios 2. 添加插件,這裏很熟悉.. ...
- css选择器分类
css选择器大致可以分为10大类: 1.元素选择器 如:p{} 2.类选择器 如:.xx{} 3.ID选择器 如:#xx{} 4.关联选择器 如:p a{} 5.子元素选择器 如:p>a{} 6 ...
- DedeCMS中function='Html2Text(@me)的用法分析
本文实例讲述了DedeCMS中function='Html2Text(@me)的用法.分享给大家供大家参考.具体分析如下: 在使用dedecms建站网站时候,需要用到过滤html代码,调出纯文本的代码 ...