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 ...
随机推荐
- python学习笔记(MD5算法)
博主最近进度停滞了 对web开发理解欠缺好多内容 今天整理下MD5算法,这个涉及到mysql数据库存储用户表密码字段的时候 一般是带有加密的 # -*- coding: utf-8 -*- impor ...
- QQ音乐API
今天分享的是QQ音乐API 搜索歌曲API:http://s.music.qq.com/fcgi-bin/music_search_new_platform?t=0& amp;n={2}&am ...
- UGUI不规则按钮实现思路
根据图片的透明度来判断是否点击到了适当区域(如果a值是0,说明完全透明,则判断为没点击,否则判断为触发点击) using UnityEngine; using System.Collections; ...
- confluence启动关闭
cd /opt/atlassian/confluence/bin startup.sh shutdown.sh
- CSS3之阴影
CSS3中新增属性-阴影,可以做出很多漂亮的效果. 文字阴影text-shadow text-shadow属性值的顺序: text-shadow: h-shadow v-shadow blur col ...
- javascript 同步加载与异步加载
HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值. defer: boolean, 可选.延迟脚本执行,相当于将script标签放入页面 ...
- 解决win 7&win xp等系统无法正常用U盘安装或启动
目前,制作启动U盘通常是用ultraiso,但由于各种硬件设备与系统的更新,导致现在装系统会出现各种错误. 在用ultraiso制作的启动U盘,装XP时,可能找不到引导项:装win7时,可能提示”wi ...
- final 的用法总结
1.修饰成员变量 修饰普通变量 表明这个变量是一个常量,不可以修改这个变量的值,一般这样的变量的变量名都要大写 修饰引用变量 表明这个引用不能够指向别的对象了,只能够指向指定的这个对象 2.修饰方法 ...
- Javascrpt
HTML HTML概述: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他 ...
- objective-C运算符和表达式
运算符可以分为以下几种: 算术运算符:+,-,*,/,%,++,—-. 关系运算符:<,>,<=,>=,==,!= 布尔逻辑运算符:!,&&,|| 位运算符:| ...