Linux C高级编程——网络编程之包裹函数

                                    Linux网络编程(六)——包裹函数


                         宗旨:技术的学习是有限的,分享的精神是无限的。


         系统调用不能保证每次都成功,必须进行出错处理。包裹函数就是把一般函数加了出错处理。包裹函数首字母大写。

/*************************************************************************> File Name: wrap.h> Author: libang> Mail: 1838039453@qq.com > Created Time: 2016年04月06日 星期三 17时23分35秒************************************************************************/
#ifndef WRAP_H
#define WRAP_H#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>void perr_exit(const char *s);
int Accept(int fd,struct sockaddr *sa,socklen_t *salenptr);
void Bind(int fd,const struct sockaddr* sa,socklen_t salen);
void Connect(int fd,const struct sockaddr* sa,socklen_t salen);
void Listen(int fd,int backlog);
int Socket(int family,int type,int protocol);
ssize_t Read(int fd,void *ptr,size_t nbytes);
ssize_t Write(int fd,const void *ptr,size_t nbytes);
ssize_t Readn(int fd,void *vptr,size_t n);
ssize_t Writen(int fd,const void*vptr,size_t n);
static ssize_t my_read(int fd,char *ptr);
static Readline(int fd,void *vptr,size_t maxlen);
void Close(int fd);#endif

/*************************************************************************> File Name: wrap.c> Author: libang> Mail: 1838039453@qq.com> Created Time: 2016年04月06日 星期三 17时53分25秒************************************************************************/#include "wrap.h"void perr_exit(const char *s)
{perror(s);exit(1);
}int Accept(int fd, struct sockaddr *sa, socklen_t* salenptr)
{int newfd;
again:if((newfd = accept(fd, sa, salenptr)) < 0){if((errno == ECONNABORTED) || (errno == EINTR)){goto again;}else{perr_exit("accept error");}}return newfd;
}void Bind(int fd, const struct sockaddr* sa, socklen_t salen)
{if(bind(fd, sa, salen) < 0){perr_exit("bind error");}
}void Connect(int fd, const struct sockaddr *sa, socklen_t salen)
{if(connect(fd, sa, salen) < 0){perr_exit("connect error");}
}void Listen(int fd, int backlog)
{if(listen(fd, backlog) < 0){perr_exit("listen error");}
}int Socket(int family, int type, int protocol)
{int socketfd;if((socketfd = socket(family, type, protocol)) < 0){perr_exit("socket error");}return socketfd;
}ssize_t Read(int fd, void *ptr, size_t nbytes)
{ssize_t n;
again:if((n = read(fd, ptr, nbytes)) == -1){if(errno == EINTR){goto again;}else{return -1;}}return n;
}ssize_t Write(int fd, const void *ptr, size_t nbytes)
{ssize_t n;
again:if((n = write(fd, ptr, nbytes)) == -1){if(errno == EINTR){goto again;}else{return -1;}}return n;
}ssize_t Readn(int fd, void *vptr, size_t n)
{size_t nleft;ssize_t nread;char *ptr;ptr = vptr;nleft = n;while(nleft > 0){if((nread = read(fd, ptr, nleft)) < 0){if(errno == EINTR){nread = 0;}else{return -1;}}else if(nread == 0){break;}nleft -= nread;ptr += nread;}return (n - nleft);
}ssize_t Writen(int fd, const void *vptr, size_t n)
{size_t nleft;ssize_t nwritten;const char* ptr;ptr = vptr;nleft = n;while(nleft > 0){if((nwritten = write(fd, ptr, nleft)) <= 0){if(nwritten < 0 && errno == EINTR){nwritten = 0;}else{return -1;}}nleft -= nwritten;ptr += nwritten;}return n;
}static ssize_t my_read(int fd, char *ptr)
{static int read_cnt;static char *read_ptr;static char read_buf[100];if(read_cnt <= 0){
again:if((read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0){if(errno == EINTR){goto again;}else{return -1;}}else if(read_cnt == 0){return 0;}read_ptr = read_buf;}read_cnt--;*ptr = *read_ptr++;return 1;
}ssize_t Readline(int fd, void *vptr, size_t maxlen)
{ssize_t n, rc;char c, *ptr;ptr = vptr;for(n = 1; n < maxlen; n++){if((rc = my_read(fd, &c)) == 1){*ptr++ = c;if(c == '\n'){break;}}else if(rc == 0){*ptr = 0;return n - 1;}else{return (n - 1);}}*ptr = 0;return n;
}void Close(int fd)
{if(close(fd) == -1){perr_exit("close error");}
}
/*************************************************************************> File Name: server.c> Author: libang> Mail: 1838039453@qq.com > Created Time: 2016年04月6日 星期日 23时51分26秒************************************************************************/#include "wrap.h"#define MAXLINE 80
#define SERV_PORT 8000int main(int argc,char *argv[])
{struct sockaddr_in servaddr,cliaddr;socklen_t cliaddr_len;int sockfd;char buf[MAXLINE];char str[INET_ADDRSTRLEN];//系统定义的宏TCP:16  UDP:46int i,n;/* 服务器端开始建立sockfd描述符 */ sockfd = Socket(AF_INET,SOCK_DGRAM,0);// AF_INET:IPV4;SOCK_STREAM:TCP/* 服务器端填充 sockaddr结构 */ bzero(&servaddr,sizeof(servaddr));// 初始化,置0servaddr.sin_family = AF_INET;		// Internetservaddr.sin_addr.s_addr = htonl(INADDR_ANY);// (将本机器上的long数据转化为网络上的long数据)和任何主机通信  //INADDR_ANY 表示可以接收任意IP地址的数据,即绑定到所有的IP//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1");  //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ipservaddr.sin_port = htons(SERV_PORT);	// (将本机器上的short数据转化为网络上的short数据)端口号/* 捆绑sockfd描述符到IP地址 */ Bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));printf("Accept connections ...\n");while(1){cliaddr_len = sizeof(cliaddr);//地址长度n = recvfrom(sockfd,buf,MAXLINE,0,(struct sockaddr *)&cliaddr,&cliaddr_len );//接收客户端信息到buf中if(n == -1)perr_exit("recvfrom error");printf("recvfrom from %s at PORT %d\n",inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),ntohs(cliaddr.sin_port));for(i=0;i<n;i++)buf[i] = toupper(buf[i]);//小写转大写n = sendto(sockfd,buf,n,0,(struct sockaddr*)&cliaddr,sizeof(cliaddr));//把buf内容发送sockfd中发给客户端if(n == -1)perr_exit("sendto error");}return 0;
}
/*************************************************************************> File Name: client.c> Author: libang> Mail: 1838039453@qq.com > Created Time: 2016年04月6日 星期一 23时03分44秒************************************************************************/#include "wrap.h"#define MAXLINE 80
#define SERV_PORT 8000
int main(int argc,char *argv[])
{struct sockaddr_in servaddr;int sockfd,n;char buf[MAXLINE];char str[INET_ADDRSTRLEN];//系统定义的宏TCP:16  UDP:46socklen_t servaddr_len;/* 服务器端开始建立sockfd描述符 */sockfd = Socket(AF_INET,SOCK_DGRAM,0);/* 客户程序填充服务端的资料 */ bzero(&servaddr,sizeof(servaddr));// 初始化,置0servaddr.sin_family = AF_INET;	// IPV4inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);// IP地址servaddr.sin_port = htons(SERV_PORT);// (将本机器上的short数据转化为网络上的short数据)端口号while(fgets(buf,MAXLINE,stdin) != NULL)//从键盘输入内容{/*发送buf到sockfd中*/n = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&servaddr,sizeof(servaddr));if(n == -1)perr_exit("recvfrom error");n = recvfrom(sockfd,buf,MAXLINE,0,NULL,0);if(n == -1)perr_exit("recvfrom error");Write(STDOUT_FILENO,buf,n);//写到标准输出中}Close(sockfd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

输入一个数3256,将他从小到大输出,就是2356

这是知乎上面的一个题目&#xff0c;挺有意思&#xff0c;面试的时候应该是作为基础题&#xff0c;很多人不屑于看这样的题目&#xff0c;但是到自己些的时候&#xff0c;就会有很多问题。题目要求输入一个数3256&#xff0c;将他从小到大输出&#xff0c;就是2356分析输入的是…

在过渡到Agile中的十种错误

原文: http://www.ddj.com/architect/193402902为了走得更快必须减缓转变。从传统开发方法论到Agile的过渡中最普遍的10种错误&#xff1a;1直接全部参与。没有以试验项目作为开始。这样造成在项目推行新的方法论有很高风险&#xff0c;因为你在时间紧迫或风险较大的项目中没有…

深度学习之负荷分解——LSTM(一对多)任务场景

1.任务场景 以家庭为例&#xff0c;假设该家庭有m种电器和总负荷的曲线&#xff0c;其中&#xff0c;总负荷为,各个电器的负荷有&#xff08;m是电器个数&#xff0c;n是n个时刻&#xff09;。我们需要通过对总负荷曲线进行分解&#xff0c;识别出该负荷有几种电器同时运行实现…

这是我见过最秀的代码

这么秀的代码&#xff0c;你能写出来吗&#xff1f;技术主管来了都不好使&#xff0c;main函数里第一个函数必须是这个。佛祖保佑版&#xff1a;void godBless(void) { // _ooOoo_ // o8888888o // …

java-构建jar带哟参数提示的

使用command的cli包构建带有参数提示的jar包 需要引入command cli的依赖 <commons.version>1.2</commons.version> <dependency><groupId>commons-cli</groupId><artifactId>commons-cli</artifactId><version>${commons.vers…

Cortex M3存储器映射

CortexM3存储器系统 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 CM3 只有一个单一固定的存储器映射。这一点极大地方便了软件在各种 CM3 单片机间的移植。 存储空间的一些位置用于调试组件等私有外设&#xff0c;这个地址段被称为“私有外设区”。私…

sql server 分页

分页方案一&#xff1a;(利用Not In和SELECT TOP分页) 语句形式&#xff1a; SELECT TOP 10 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 20 id FROM TestTable ORDER BY id)) ORDER BY ID SELECT TOP 页大小 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 页大小*页数 i…

这些年,NLP常见的预训练模型剖析

“预训练-微调”&#xff08;pre-training and fine-tune&#xff09; 已经成为解决NLP任务的一种新的范式。基于预训练语言模型的词表示由于可以建模上下文信息&#xff0c;进而解决传统静态词向量不能建模“一词多义”语言现象的问题。传统的词向量有one-hot&#xff08;杜热…

Linux Ftrace 使用

Ftrace相关的文章如何利用ftrace精确跟踪特定进程调度信息1、Ftrace 是什么东西&#xff1f;Ftrace是一个直接内置在Linux内核中的跟踪工具。许多发行版在最近的发行版中已经启用了各种各样的Ftrace配置。Ftrace给Linux带来的好处之一是能够看到内核中发生了什么。因此&#xf…

java中原始数据文件的输入

in.data中的数据"28.7812 34.4632 31.3381 31.2834..."File fileInnew File("in.data");//File fileOutnew File("out.data");if(fileIn.exists()){System.out.println("the files path:"fileIn.getPath());System.out.println("…

Cortex M3寄存器组

寄存器组 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、通用目的寄存器R0~R7 R0-R7 也被称为低组寄存器。所有指令都能访问它们。它们的字长全是 32 位&#xff0c;复位后的初始值是不可预料的。 2、通用目的寄存器 R8-R12 R8-R12 也被称为高组寄…

深度学习-超参数调优

在机器学习中有很多调优的方式机器学习——超参数调优&#xff0c;深度学习中也存在同样的方式&#xff0c;接下来&#xff0c;介绍一下深度学习框架里边的自动调参模块。 1. 基于Tensorflow的Keras tuner 官方教程如下&#xff1a;Introduction to the Keras Tuner | Tens…

【文章汇总】嵌入式Linux公众号

据悉,深圳某工程师沦为C语言笔试枪手 修改cmdline 把内存改成512MB 上拉电阻的作用

Leetcode分类

二叉树平衡二叉树easy 108. Convert Sorted Array to Binary Search Tree 2. 二叉树 617. Merge Two Binary Trees 104. Maximum Depth of Binary Tree 列表题&#xff1a;21. Merge Two Sorted Lists 字符串题数组题排序347. Top K Frequent Elements 归并递归70. Climbing S…

第5节 三个败家子(5)——刘封,被封印的秘密

根据《三国志刘封传》记载“刘封者&#xff0c;本罗侯寇氏之子&#xff0c;长沙刘氏之甥也。先主至荆州&#xff0c;以未有继嗣&#xff0c;养封为子。及先主入蜀&#xff0c;自葭萌还攻刘璋&#xff0c;时封年二十余”。等等&#xff0c;各位看官说了&#xff0c;时间上不对啊…

Paddle——常见的评估指标

在模型评估过程中&#xff0c;分类、回归、排序问题往往使用不同的指标进行评估。分类问题通常用准确率、召回率、精准率、F1值等指标进行评估&#xff1b;回归问题使用MSE、RMSE、R^2、MAPE等&#xff1b; 1 分类评估原理 1.1 准确率的局限性 我们经常接触的评价指标就是准…

大江大河,随笔观后感

我是「大江大河」的铁粉&#xff0c;非常喜欢这部剧&#xff0c;从这部剧里面能看到生活的一些影子。从这部剧里面也可以看到不同阶层的人们对待生活&#xff0c;对待理想&#xff0c;对待身边的朋友亲人的态度。—— 知乎热论「程开颜为什么输给了杨思申&#xff1f;」程开颜并…

Cortex M3内核架构

CortexM3内核架构 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、ARMCortex-M3处理器 Cortex-M3处理器内核是单片机的中央处理单元&#xff08; CPU&#xff09;。 完整的基于CM3的MCU还需要很多其它组件。在芯片制造商得到CM3处理器内核的使用授权…

瀑布流布局(1)

前言 完成一个动漫人物的瀑布流布局&#xff0c;分别通过原生JavaScript、Css3和Jquery方式实现。 首先是使用JavaScript。 一、创建基本框架 1 HTML结构 <main> //便于以后进行 相对定位<div class"wrap"> //为了方便设置图片和图…