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 ...
随机推荐
- Office2010安装错误
Office2010安装“错误1406.安装程序无法将值Assembly写入注册表项” 我们在安装Office2010的时候,会遇到如上所示的错误. 今天我自己在安装的过程中就遇到类似的情况.由于我原 ...
- c-windows-1
< Back 我使用的是<windows程序设计>和VS 首先看到的第一个代码是: /*----------------------------------------------- ...
- css+js+html基础知识总结
css+js+html基础知识总结 一.CSS相关 1.css的盒子模型:IE盒子模型.标准W3C盒子模型: 2.CSS优先级机制: 选择器的优先权:!important>style(内联样式) ...
- 学习笔记-解析xml文件
1. Dom4J <students> <student> <name>吴飞</name> <c ...
- NAT学习笔记
NAT介绍 NAT, 全称网络地址转换(Network Address Translation),是一种在IP封包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术. NAT的分类及介绍 NAT ...
- Selenium2.0介绍
selenium是一个web的自动化测试工具,和其它的自动化工具相比来说其最主要的特色是跨平台.跨浏览器. 支持windows.linux.MAC,支持ie.ff.safari.opera.chrom ...
- 关于static/const的作用
这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区). 2) 在模块内 ...
- Swift学习(二)
一.方法 在OC中,函数是C语言的形式,跟方法不一样 函数:int sum (int num1, int num2) { return num1 + num2; } 方法:- (int)sum:( ...
- TCP/IP详解学习笔记(13)-- TCP连接的建立与终止
1.TCP连接的建立 设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客户进程发起连续 ...
- 图形化Cisco设备管理实践(附安装配置视频)
图形化Cisco设备管理实践 Ciscoworks 2000是Cisco公司推出的基于SNMP协议的网络管理系统,通过它网络管理人员可以方便快捷地完成设备的配置.管理.监控和故障分析等任务, Cisc ...