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 ...
随机推荐
- Laxcus大数据管理系统2.0(14)- 后记
后记 Laxcus最早源于一个失败的搜索引擎项目,项目最后虽然终止了,但是项目中的部分技术,包括FIXP协议.Diffuse/Converge算法.以及很多新的数据处理理念却得以保留下来,这些成为后来 ...
- jmeter的分布式部署
在使用Jmeter进行性能测试时,如果并发数比较大(比如5000+并发),单台电脑的配置(CPU和内存)可能无法支持(公司配的联想e450家庭用笔记本一般到1000就会卡死),这时可以使用Jmeter ...
- 传智Java基础知识测试
共40道选择题,每题2.5分.多选题有错则全错,全对才满分. 单选题: 1. 下列哪个声明是错误的?(B) A. int i=10; B. float f=1.1; C. double ...
- Drupal8开发教程:模块开发——创建新页面
之前我们已经通过<Drupal8开发教程:认识.info.yml文件>对模块的YAML文件有了了解,今天我们来看如何通过模块开发的方式添加一个新的页面. 在 Drupal 7 中,通过模块 ...
- Mistral 工作流组件之一 概述
Mistral的前世今生: Mistral是Mirantis公司为Openstack开发的工作流组件,提供Workflow As a Service.典型的应用场景包括任务计划服务Cloud Cro ...
- Hadoop的奇技淫巧
(2-6为性能优化)(7-9为函数介绍) 1.在JobHistory里面可以看到job相关的一些信息,用start-all启动Hadoop时便可以进入端口号8088查看查看信息,但是无法进入端口号19 ...
- 【测试】在hr用户下自行创建T1和T2表写一条SQL语句,(NL连接)
SQL> select t1.* from t1,t2 where t1.object_id=t2.object_id; rows selected. Execution Plan ------ ...
- ORA-00933: SQL command not properly ended
今天写了一个小的SQL语句类似下面的这句: UPDATE A SET ID=B.ID FROM A,B WHERE A.NAME=B.NAME 在执行时居然报了“ORA-00933: SQL comm ...
- sql基础查询语句
数据库文件百度云地址:www.pan.baidu.com 脚步:下载博客园文件:select_learn.rar 1.TOP限制返回行数[percent] * from book_info --显示前 ...
- C# 加密算法
public static class Common { #region MD5加密 /// <summary> /// M ...