当前位置: 首页 > news >正文

北京 网站设计互联网运营培训课程

北京 网站设计,互联网运营培训课程,WordPress浩子,学校网站建设方法//sockhelp.h#ifndef _vx #define _vx#ifdef __cplusplus extern "C" { #endif /*** readn - 读取指定大小的字节* fd:文件描述符* buf:接收字节缓冲区* count:指定的字节数* 成功返回指定字节数,失败返回-1&#xff0c…
//sockhelp.h
#ifndef _vx
#define _vx#ifdef __cplusplus extern "C" { #endif /*** readn - 读取指定大小的字节* @fd:文件描述符* @buf:接收字节缓冲区* @count:指定的字节数* 成功返回指定字节数,失败返回-1,对方连接已经关闭,返回已经读取字节数<count* */ int readn(int fd, void *buf, int count);/*** writen - 写入指定大小的字节* @fd:文件描述符* @buf:发送字节缓冲区* @count:指定的字节数* 成功返回指定字节数,失败返回-1* */ int writen(int fd, void *buf, int count);/*** read_timeout - 读超时检测函数,不含读操作* @fd:文件描述符* @wait_seconds:等待超时秒数,如果为0表示不检测超时* 成功返回0,失败返回-1,超时返回-1并且errno = ETIMEDOUT* */ int read_timeout(int fd, unsigned int wait_seconds);/*** write_timeout - 写超时检测函数,不含写操作* @fd:文件描述符* @wait_seconds:等待超时秒数,如果为0表示不检测超时* 成功返回0,失败返回-1,超时返回-1并且errno = ETIMEDOUT* */ int write_timeout(int fd, unsigned int wait_seconds);/*** accept_timeout - 带超时accept (方法中已执行accept)* @fd:文件描述符* @addr:地址结构体指针* @wait_seconds:等待超时秒数,如果为0表示不检测超时* 成功返回已连接的套接字,失败返回-1,超时返回-1并且errno = ETIMEDOUT* */ int accept_timeout(int fd, struct sockaddr_in *addr, unsigned int wait_seconds);/*** connect_timeout - 带超时的connect(方法中已执行connect)* @fd:文件描述符* @addr:地址结构体指针* @wait_seconds:等待超时秒数,如果为0表示不检测超时* 成功返回0.失败返回-1,超时返回-1并且errno = ETIMEDOUT* */ int connect_timeout(int fd, struct sockaddr_in *addr, unsigned int wait_seconds);/*** activate_nonblock - 设置套接字非阻塞* @fd:文件描述符* 成功返回0,失败返回-1* */ int activate_nonblock(int fd);/*** deactivate_nonblock - 设置套接字阻塞* @fd:文件描述符* 成功返回0,失败返回-1* */ int deactivate_nonblock(int fd);#ifdef __cplusplus } #endif #endif
////sockhelp.c
//socket发送接收底层辅助方法
/*底层辅助方法不打印错误信息,由上层调用通过errno打印信息,并且不做参数验证,有调用函数验证*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <sys/select.h>
#include <fcntl.h>
#include <netinet/in.h>/*** readn - 读取指定大小的字节* @fd:文件描述符* @buf:接收字节缓冲区* @count:指定的字节数* 成功返回指定字节数,失败返回-1,对方连接已经关闭,返回已经读取字节数<count* */
int readn(int fd, void *buf, int count)
{//定义剩余字节数int lread = count;//定义每次读取的字节数int nread = 0;//定义辅助指针变量char *pbuf = (char *) buf;//如果剩余字节数大于0,循环读取while (lread > 0){nread = read(fd, pbuf, lread);if (nread == -1){//read()是可中断睡眠函数,需要屏蔽信号if (errno == EINTR)continue;//read()出错,直接退出return -1;} else if (nread == 0){//对方关联连接return count - lread;}//重置剩余字节数lread -= nread;//辅助指针变量后移pbuf += nread;}return count;
}/*** writen - 写入指定大小的字节* @fd:文件描述符* @buf:发送字节缓冲区* @count:指定的字节数* 成功返回指定字节数,失败返回-1* */
int writen(int fd, void *buf, int count)
{//剩余字节数int lwrite = count;//每次发送字节数int nwrite = 0;//定义辅助指针变量char *pbuf = (char *) buf;while (lwrite > 0){nwrite = write(fd, pbuf, lwrite);if (nwrite == -1){//注意:由于有TCP/IP发送缓存区,所以即使对方关闭连接,发送也不一定会失败//所以需要捕捉SIGPIPE信号return -1;}lwrite -= nwrite;pbuf += nwrite;}return count;
}/*** read_timeout - 读超时检测函数,不含读操作* @fd:文件描述符* @wait_seconds:等待超时秒数,如果为0表示不检测超时* 成功返回0,失败返回-1,超时返回-1并且errno = ETIMEDOUT* */
int read_timeout(int fd, unsigned int wait_seconds)
{int ret = 0;if (wait_seconds > 0){//定义文件描述符集合
        fd_set readfds;//清空文件描述符FD_ZERO(&readfds);//将当前文件描述符添加集合中FD_SET(fd, &readfds);//定义时间变量struct timeval timeout;timeout.tv_sec = wait_seconds;timeout.tv_usec = 0;do{ret = select(fd + 1, &readfds, NULL, NULL, &timeout);} while (ret == -1 && errno == EINTR);//ret==-1时,返回的ret正好就是-1if (ret == 0){errno = ETIMEDOUT;ret = -1;} else if (ret == 1){ret = 0;}}return ret;
}/*** write_timeout - 写超时检测函数,不含写操作* @fd:文件描述符* @wait_seconds:等待超时秒数,如果为0表示不检测超时* 成功返回0,失败返回-1,超时返回-1并且errno = ETIMEDOUT* */
int write_timeout(int fd, unsigned int wait_seconds)
{int ret = 0;if (wait_seconds > 0){//定义文件描述符集合
        fd_set writefds;//清空集合FD_ZERO(&writefds);//添加文件描述符FD_SET(fd, &writefds);//定义时间变量struct timeval timeout;timeout.tv_sec = wait_seconds;timeout.tv_usec = 0;do{ret = select(fd + 1, NULL, &writefds, NULL, &timeout);} while (ret == -1 && errno == EINTR);if (ret == 0){errno = ETIMEDOUT;ret = -1;} else if (ret == 1){ret = 0;}}return ret;
}/*** accept_timeout - 带超时accept (方法中已执行accept)* @fd:文件描述符* @addr:地址结构体指针* @wait_seconds:等待超时秒数,如果为0表示不检测超时* 成功返回已连接的套接字,失败返回-1,超时返回-1并且errno = ETIMEDOUT* */
int accept_timeout(int fd, struct sockaddr_in *addr, unsigned int wait_seconds)
{int ret = 0;if (wait_seconds > 0){fd_set readfds;FD_ZERO(&readfds);FD_SET(fd, &readfds);struct timeval timeout;timeout.tv_sec = wait_seconds;timeout.tv_usec = 0;do{ret = select(fd + 1, &readfds, NULL, NULL, &timeout);} while (ret == -1 && errno == EINTR);if (ret == -1){return ret;} else if (ret == 0){ret = -1;errno = ETIMEDOUT;
       return ret;}
//成功无需处理,直接往下执行 }if (addr != NULL){socklen_t len = sizeof(struct sockaddr_in);ret = accept(fd, (struct sockaddr *) addr, &len);} else{ret = accept(fd, NULL, NULL);}return ret; }/*** activate_nonblock - 设置套接字非阻塞* @fd:文件描述符* 成功返回0,失败返回-1* */ int activate_nonblock(int fd) {int ret = 0;int flags = fcntl(fd, F_GETFL);if (flags == -1)return -1;flags = flags | O_NONBLOCK;ret = fcntl(fd, F_SETFL, flags);if (ret == -1)return -1;return ret; }/*** deactivate_nonblock - 设置套接字阻塞* @fd:文件描述符* 成功返回0,失败返回-1* */ int deactivate_nonblock(int fd) {int ret = 0;int flags = fcntl(fd, F_GETFL);if (flags == -1)return -1;flags = flags & (~O_NONBLOCK);ret = fcntl(fd, F_SETFL, flags);if (ret == -1)return -1;return ret; }/*** connect_timeout - 带超时的connect(方法中已执行connect)* @fd:文件描述符* @addr:地址结构体指针* @wait_seconds:等待超时秒数,如果为0表示不检测超时* 成功返回0.失败返回-1,超时返回-1并且errno = ETIMEDOUT* */ int connect_timeout(int fd, struct sockaddr_in *addr, unsigned int wait_seconds) {int ret = 0;//connect在网络中非常耗时,所以需要设置成非阻塞if (wait_seconds > 0){if (activate_nonblock(fd) == -1)return -1;}ret = connect(fd, (struct sockaddr *) addr, sizeof(struct sockaddr));if (ret == -1 && errno == EINPROGRESS){fd_set writefds;FD_ZERO(&writefds);FD_SET(fd, &writefds);struct timeval timeout;timeout.tv_sec = wait_seconds;timeout.tv_usec = 0;do{ret = select(fd + 1, NULL, &writefds, NULL, &timeout);} while (ret == -1 && errno == EINTR);if (ret == 0){errno = ETIMEDOUT;ret = -1;} else if (ret == 1){//判断可读是否是套接字错误int err = 0;socklen_t len = sizeof(err);ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &len);//ret==-1 不需要处理,正好给ret赋值if (ret == 0 && err != 0){errno = err;ret = -1;}}}if (wait_seconds > 0){if (deactivate_nonblock(fd) == -1)return -1;}return ret; }
.SUFFIXES:.c .o
CC=gcc
SRCS=sockhelp.c
OBJS=$(SRCS:.c=.o)
EXEC=libsockhelp.sostart:$(OBJS)$(CC) -shared -o $(EXEC) $(OBJS)@echo "^_^-----OK------^_^"
.c.o:$(CC) -Wall -g -fPIC -o $@ -c $<
clean:rm -f $(OBJS)rm -f $(EXEC)

 

http://www.lbrq.cn/news/2407645.html

相关文章:

  • 免费搭建个人网站的3种实用方法做网站好的网站建设公司
  • 如何用七牛云做视频网站怎么做市场推广
  • 单位网站建设存在问题情况汇报如何搜索关键词
  • 常平哪里有招计算机网站开发的网站首页制作网站
  • 山东省城乡建设厅网站互联网运营推广公司
  • 做网站怎么招广告网络软文营销案例
  • 网站关键词几个好公司seo是什么意思
  • 5G网站建设要多少个广告网址
  • PC端网站开发以及设计费用搜索引擎推广
  • 阿里做外贸的网站关键词优化seo费用
  • 做网站赌博代理没有盈利违法吗可以投放广告的网站
  • 自己建网站免费今天的新闻
  • 苏州工业园区规划建设委员会网站友情链接模板
  • 最佳建站模板关键字查找
  • sns社交网站 建设网上有免费的网站吗
  • 中国做网站推广哪家好网络营销的常用工具
  • 沈阳公司网站制作seo百科
  • 网站互动推广google seo实战教程
  • 全球新冠最新数据报告seo外链推广员
  • 注入漏洞网站源码百度2020新版下载
  • 在家做网站或ps挣钱接活整合营销传播的概念
  • wordpress雪人主题宁波企业seo推广
  • 网站总体规划设计说明重庆seo代理计费
  • 石家庄最新大事百度seo官方网站
  • 云虚拟主机搭建网站谷歌搜索引擎首页
  • 代帮企业做网站上海全网营销推广
  • 做网站什么空间比较好深圳整站seo
  • 凯里网站制作域名排名查询
  • 网页设计案例教程杨松答案app优化方案
  • 做网站一般做几个尺寸点击进入官方网站
  • 【LeetCode 热题 100】236. 二叉树的最近公共祖先——DFS
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十五课——正弦波图像的FPGA实现
  • 【Linux】如何理解 “一切皆文件”
  • 访问 gitlab 跳转 0.0.0.0
  • uniapp props、$ref、$emit、$parent、$child、$on
  • 6-大语言模型—预训练:数据处理