学习 UNIX网络编程卷1:套接字 笔记1-实现一个简单的回射客户服务器程序

Unix/Linux网络编程(1)——简单的TCP客户服务器模型 简单的TCP客户服务器模型 阅读详情

一:客户端程序

1、头文件:unp.h


#ifndef _unp_h
#define _unp_h
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <sys/time.h> /* timeval{} for select() */
#include <time.h>  /* timespec{} for pselect() */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <errno.h>
#include <fcntl.h>  /* for nonblocking */
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h>  /* for iovec{} and readv/writev */
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h>  /* for Unix domain sockets */
#define MAXLINE 4096
#define LISTENQ 5
#define SERV_PORT   9877
int Socket(int sockfd, int type, int protocol);
void Bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
void Listen(int sockfd,int backlog);
void Connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
int Accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
void Write(int fd,void *buf,size_t count);
void Close(int sockfd);
void err_sys(char *err_str);
int Fork();
void str_echo(int sockfd);
ssize_t writen(int fd, char *buf, size_t n);
ssize_t Writen(int fd, char *buf, size_t n);
void str_cli(FILE *fp, int sockfd);
ssize_t readline(int fd, void *vptr, size_t maxlen);
ssize_t Readline(int fd, void *vptr, size_t maxlen);
#endif
2、客户端主程序:clien.c

#include "unp.h"

int main(int argc,char **argv)
{
    char ip_addr[20];
    int sockfd;
    struct sockaddr_in servaddr;
    if (argc != 2)
    {
        err_sys("usage:clien <IPaddress>");
        return -1;
    }

    bzero(&servaddr, sizeof(servaddr));
    bzero(ip_addr,sizeof(ip_addr));
    strcpy(ip_addr,argv[1]);
    sockfd = Socket(AF_INET, SOCK_STREAM, 0);
    
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);
    //servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servaddr.sin_addr.s_addr = inet_addr(ip_addr);
    Connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    str_cli(stdin,sockfd);

    return 0;

}

3、客户端包裹函数:pack.c

#include "unp.h"

void err_sys(char *err_str)
{
  perror(err_str);
}

int Socket(int sockfd, int type, int protocol)
{
  int n=0;
  if ((n=socket(sockfd,type,protocol))<0)
  {
    err_sys("socket error");
  }
  return n;
}

void Bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen)
{
  int n=0;
  if ((n = bind(sockfd,myaddr,addrlen))<0)
  {
    err_sys("bind error");
  }
}

void Listen(int sockfd,int backlog)
{
  char *ptr=NULL;
  if ((ptr=getenv("LISTENQ"))!=NULL)
  {
    backlog=atoi(ptr);
  }
  if (listen(sockfd,backlog)<0)
  {
    err_sys("listen error");
  }
}

void Connect(int sockfd,const struct sockaddr *servaddr, socklen_t addrlen)
{
  if(connect(sockfd,servaddr,addrlen)<0)
  {
    err_sys("connect error");
  }
  else
  {
    printf("connect success!\n");
  }
}

int Accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen)
{
  int n;
  again:
    if ((n=accept(sockfd,cliaddr,addrlen))<0)
    {
#ifndef EPROTO
      if(errno == EPROTO || errno == ECONNABORTED)
#else
      if(errno == ECONNABORTED)
#endif
      {
          goto again;
      }
      else
      {
        err_sys("accept error");
      }
    }
  return n;
}

ssize_t Writen(int fd,char *buf, size_t n)
{
  ssize_t ret;
  ret = writen(fd,buf,n);
  if (ret < 0)
  {
    err_sys("writen error");
    return -1;
  }
  return ret;
}

ssize_t Readline(int fd, void *vptr, size_t maxlen)
{
  ssize_t n;
  n=readline(fd,vptr,maxlen);
  if (n<0)
  {
    err_sys("readline error");
    return -1;
  }
  return n;
}

4、客户端功能行函数:func.c

#include "unp.h"
ssize_t writen(int fd, char *buf, size_t n)
{
  size_t nleft;
  ssize_t nwritten;
  char *ptr;
  ptr = buf;
  nleft = n ;
  while(nleft > 0)
  {
    nwritten = write(fd, ptr, nleft);
    if (nwritten < 0 && errno == EINTR)
    {
      nwritten = 0;      
    }
    else if (nwritten < 0)
    {
      err_sys("write error");
      return -1;
    }

    nleft -= nwritten;
    ptr += nwritten;
  }
  return n;
}

void str_echo(int sockfd)
{
  ssize_t n;
  char buf[MAXLINE];
  again:
    while ((n = read(sockfd, buf, MAXLINE))>0)
      Writen(sockfd, buf, n);
  if (n < 0 && errno == EINTR)
  {
    goto again;
  }
  else if (n < 0)
  {
    err_sys("str_echo error");
  }
}
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++)
    {
        again:
            if ((rc = read(fd, &c, 1)) == 1)
            {
                *ptr++ = c;
                if (c == '\n')
                {
                    break;
                }
            }
            else if (rc == 0)
            {
                *ptr = 0;
                return (n-1);
            }
            else
            {
                if (errno == EINTR)        
                {
                    goto again;
                }
                return -1;
            }
    }
    *ptr = 0;
    return n;
}

void str_cli(FILE *fp, int sockfd)
{
    char sendline[MAXLINE],recvline[MAXLINE];
    bzero(sendline,sizeof(sendline));
    bzero(recvline,sizeof(recvline));

    while(fgets(sendline,MAXLINE,fp) != NULL)
    {
        Writen(sockfd,sendline,strlen(sendline));
        if (Readline(sockfd, recvline, MAXLINE) == 0)
        {
            err_sys("str_cli Readline error");
        }
        fputs(recvline, stdout);
    }
}

5、客户端Makefile

clien:clien.o pack.o func.o
    gcc clien.o pack.o func.o -o clien
clien.o:clien.c unp.h 
    gcc -c clien.c -o clien.o
pack.o:pack.c unp.h 
    gcc -c pack.c -o pack.o
func.o:func.c unp.h 
    gcc -c func.c -o func.o    
.PHONY:clean
clean:
    rm -f *.o

二:服务器程序

1、头文件:unp.h

#ifndef _unp_h
#define _unp_h
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <sys/time.h> /* timeval{} for select() */
#include <time.h>  /* timespec{} for pselect() */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <errno.h>
#include <fcntl.h>  /* for nonblocking */
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h>  /* for iovec{} and readv/writev */
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h>  /* for Unix domain sockets */
#define MAXLINE 4096
#define LISTENQ 5
#define SERV_PORT   9877
typedef void (*sighandler_t)(int);
sighandler_t Signal(int signum, sighandler_t handler);//signal函数的包裹函数
int Socket(int sockfd, int type, int protocol);//socket的包裹函数
void Bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);//bind函数的包裹函数
void Listen(int sockfd,int backlog);//listen函数的包裹函数
void Connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);//connect函数的包裹函数
int Accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);//accept函数的包裹函数
void Write(int fd,void *buf,size_t count);//write函数的包裹函数
void Close(int sockfd);//关闭套接字函数close的包裹函数
void err_sys(char *err_str);//错误输出函数
int Fork();//fork函数的包裹函数
void str_echo(int sockfd);//回射函数
ssize_t writen(int fd, char *buf, size_t n);//写n个字符的writen函数
ssize_t Writen(int fd, char *buf, size_t n);//writen函数的包裹函数
void sig_chlid(int signo);//信号控制函数sig_child
#endif


2、服务器主程序:serv.c

#include "unp.h"
void sig_chld(int );


int main(int argc, char const *argv[])
{
    int listenfd,connfd;
    pid_t childpid;
    socklen_t clilen;
    struct sockaddr_in cliaddr,servaddr;
    listenfd = Socket(AF_INET, SOCK_STREAM, 0);//监听套接字创建
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;//服务器地址族
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//服务器地址赋值,一般服务器地址不指定
    servaddr.sin_port = htons(SERV_PORT);//服务器端口赋值
    Bind(listenfd,(struct sockaddr*)&servaddr, sizeof(servaddr));//绑定监听套接字与服务器的端口
    Listen(listenfd, LISTENQ);  //监听
    Signal(SIGCHLD, sig_chld);  //回收僵死子进程
    while(1)
    {
        clilen = sizeof(cliaddr);
        connfd = Accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);//accept创建已连接套接字connfd
        if (connfd<0) {
          if(errno == EINTR)//处理系统中断
          {
            continue;
          }
          else
          {
            err_sys("accept error");
          }
        }
        if ((childpid = Fork()) == 0)//创建子进程
        {
            Close(listenfd);//子进程关闭监听套接字
            str_echo(connfd);//调用回射函数
            exit(0);
        }
        else//父进程
        {
            Close(connfd);//父进程关闭已连接套接字
        }


    }
    return 0;
}

3、包裹函数:pack.c

#include "unp.h"


void err_sys(char *err_str)
{
  perror(err_str);
}


int Socket(int sockfd, int type, int protocol)
{
  int n=0;
  if ((n=socket(sockfd,type,protocol))<0)
  {
    err_sys("socket error");
  }
  printf("socket success!sockfd=%d\n",n);
  return n;
}


void Bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen)
{
  int n=0;
  if ((n = bind(sockfd,myaddr,addrlen))<0)
  {
    err_sys("bind error");
  }
  printf("bind success\n");
}


void Listen(int sockfd,int backlog)
{
  char *ptr=NULL;
  if ((ptr=getenv("LISTENQ"))!=NULL)
  {
    backlog=atoi(ptr);
  }
  if (listen(sockfd,backlog)<0)
  {
    err_sys("listen error");
  }
  printf("listen success\n");
}


void Connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen)
{
  if(connect(sockfd,servaddr,addrlen)<0)
  {
    err_sys("connect error");
  }
  printf("connect success!\n");
}


int Accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen)
{
  int n;
  again:
    if ((n=accept(sockfd,cliaddr,addrlen))<0)
    {
#ifndef EPROTO
      if(errno == EPROTO || errno == ECONNABORTED)
#else
      if(errno == ECONNABORTED)
#endif
      {
          goto again;
      }
      else
      {
        err_sys("accept error");
      }
    }
  return n;
}


void Write(int fd,void *buf,size_t count)
{
	ssize_t n;
	n=write(fd,buf,count);
	if(n!=count)
	{
		err_sys("write error");
	}


}
void Close(int sockfd)
{
	if(close(sockfd)==-1)
	{
		err_sys("close error");
    }
}


int Fork()
{
  pid_t pid;
  if ((pid = fork()) < 0)
  {
    err_sys("fork error");
  }
  else
    return pid;
}


ssize_t Writen(int fd,char *buf, size_t n)
{
  ssize_t ret;
  ret = writen(fd,buf,n);
  if (ret < 0)
  {
    err_sys("writen error");
    return -1;
  }
  return ret;
}


sighandler_t Signal(int signum, sighandler_t handler)
{
  if (signal(signum, handler)==SIG_ERR)
  {
    err_sys("signal error");
    exit(-1);
  }
  
}

4、功能性函数:func.c

#include "unp.h"


ssize_t writen(int fd, char *buf, size_t n)
{
  size_t nleft;
  ssize_t nwritten;
  char *ptr;
  ptr = buf;
  nleft = n ;
  while(nleft > 0)
  {
    nwritten = write(fd, ptr, nleft);
    if (nwritten < 0 && errno == EINTR)
    {
      nwritten = 0;
    }
    else if (nwritten < 0)
    {
      err_sys("write error");
      return -1;
    }


    nleft -= nwritten;
    ptr += nwritten;
  }
  return n;
}


void str_echo(int sockfd)
{
  ssize_t n;
  char buf[MAXLINE];
  again:
    while ((n = read(sockfd, buf, MAXLINE))>0)
      Writen(sockfd, buf, n);
  if (n < 0 && errno == EINTR)
  {
    goto again;
  }
  else if (n < 0)
  {
    err_sys("str_echo error");
  }
}


void sig_chld(int signum)
{
    pid_t pid;
    int stat;


    while((pid = waitpid(-1, &stat, WNOHANG)) >0 )
    {
      printf("chlid %d terminated!\n",pid);
    }
    // pid = wait(&stat);
    // printf("child %d terminated!\n", pid);
    return ;
}
5、服务器Makefile

serv:serv.o pack.o func.o
    gcc serv.o pack.o func.o -o serv
serv.o:serv.c unp.h
    gcc -c serv.c -o serv.o
pack.o:pack.c unp.h
    gcc -c pack.c -o pack.o
func.o:func.c unp.h
    gcc -c func.c -o func.o
.PHONY:clean
clean:
    rm -f *.o




浮栅晶体管原理深度解析:热电子注入与FN隧穿如何实现1/0存储 本文深入解析了浮栅晶体管的工作原理,重点探讨了热电子注入与FN隧穿机制如何实现1/0存储。作为现代闪存芯片的核心技术,浮栅晶体管通过独特的结构设计实现非易失性存储,文章详细分析了其编程与擦除的物理过程,并对比了两种机制的优缺点,为闪存性能优化提供了理论基础。 阅读详情

相关推荐

避坑指南:RK3588上编译EtherCAT 1.6时遇到的权限问题和模块安装错误

本文详细解析了在RK3588平台上编译EtherCAT 1.6时常见的权限问题和模块安装错误,提供了两种实战解决方案和嵌入式开发的通用权限管理策略。通过优化内核配置和编译参数,显著提升实时性能,帮助开发者高效完成EtherCAT主站部署。

weixin_33724046的博客 453

TCP客户/服务器程序示例之简单的回射客户/服务器

TCP客户/服务器程序示例之简单的回射客户/服务器

weixin_45729831的博客 2417

LIGGGHTS颗粒模拟入门:从DEM原理到工程实践

离散元法(DEM)是一种用于模拟颗粒物质行为的数值方法,其核心原理是通过计算每个颗粒的运动和相互作用来预测颗粒系统的宏观行为。该方法基于牛顿第二定律和接触力学模型,能够精确描述颗粒间的碰撞、摩擦和粘结等微观机制。在工程实践中,DEM技术为优化工业设备设计、预测材料流动和减少实验成本提供了重要价值。它广泛应用于制药造粒、矿石破碎、粉体输送和农业加工等领域,帮助工程师和研究人员深入理解颗粒系统的复杂动力学。LIGGGHTS作为一款基于LAMMPS的开源DEM软件,继承了其高效的并行计算架构,并针对颗粒模拟进行了

weixin_33979203的博客 419

UNIX网络编程学习(14)--使用select正确处理EOF的str_cli函数修订版

//select/strcliselect02.c#include "unp.h" void str_cli(FILE *fp,int sockfd) { int maxfdp1,stdineof; fd_set rset; // char sendline[MAXLINE],recvline[MAXLINE]; char

技术斋 1328

概率论 知识图谱 + 实战案例解析

本文通过构建概率论知识图谱,系统梳理了从随机试验、概率、条件概率到随机变量与分布的核心概念及其内在联系。结合朴素贝叶斯分类器和蒙特卡洛模拟等实战案例,深入解析了条件概率、独立性及大数定律等理论如何应用于机器学习与实际问题求解,旨在帮助读者建立结构化思维,将理论有效转化为解决实际问题的能力。

weixin_29051193的博客 267

别再手动算频谱了!用这个在线FFT工具,5分钟搞定JSON/CSV数据分析

本文介绍了一款高效的在线FFT工具,帮助用户快速分析JSON/CSV格式的时域数据,5分钟内完成频谱分析。通过傅里叶变换(FFT)算法,大幅提升计算效率,解决传统手动计算的痛点,适用于工业振动分析、设备故障诊断等场景。

weixin_29172201的博客 258

学习unix网络编程(一)

本文主要为对UNP第五章部分内容的实验和总结。 UNP第五章对一个echo服务器和客户端在各种连接状态下的表现做了详细的分析,包括了: 正常启动和终止; accept返回前连接中止; 服务器进程终止; 客户进程忽略读错误继续写数据; 服务器主机崩溃; 服务器主机崩溃后重启; 服务器主机关机。 连接模型是最简单的TCP连接模型: 程序代码基本以UNP中提供代码为主。服务器采用图5-12、图5-11和图5-3中的代码;客户端采用图5-4和图5-5中的代码。为简化分析不采用UNP中客户端连续向服

qq_20853741的博客 448

海康威视摄像机SDK二次开发--提取音频保存至文件

由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中CameraInfo内容可以参看海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中 HIKSDKSaveRealData中的内容 package ClientDemo; import ClientDemo.CameraInfo; import com.sun.jna.NativeLong; import

RichardoMu的博客 3173

Unix网络编程代码 第5章 TCP客户/服务器程序示例

第3章 套接字编程简介 3.4 字节排序函数 #include #include #define CPU_VENDOR_OS "i686-pc-linux-gnu" int main(int argc, char **argv) { union { short s; char c[sizeof(short)]; } un; un.s = 0x0102; pri

MoXiaopeng的专栏 1539

【ubuntu】【VirtualBox】VirtualBox无法加载USB移动设备的解决方法(支持U盘启动盘)

提示:测试可用。

联系方式:927632640 2440

第3版•系统集成项目管理工程师(中级) │ 第12章 执行过程组 ✦ 管理沟通

🥏第3版•系统集成项目管理工程师(中级) │ 第12章 执行过程组 ✦ 管理沟通

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

网络编程之listen函数

基本TCP客户端/服务器程序的套接字函数listen函数仅由TCP服务调用,它做两件事    1.当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect连接的客户套接字。listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应该接受指向该套接字的连接请求。如下图所示,调用listen导致套接字从CLOSED状态转换到LISTEN状态。   ...

godop的博客 2万+

推荐系统(六)双塔模型

双塔模型是推荐场景中常用的粗排模型之一,本节主要介绍几种典型的双塔模型及其变型,如SENet 双塔模型,并联双塔,蒸馏学习,对偶增强双塔,阿里 COLD。

Jin_Kwok的博客 5144

《UNIX网络编程卷1:套接字联网API》第5章 TCP客户服务器程序示例

本章通过一个完整的**TCP回射(Echo)客户/服务器程序**,深入解析TCP套接字编程的核心流程与关键问题。示例程序的功能为:客户端发送文本至服务器,服务器将文本原样返回。通过此案例,读者将掌握: 1. **TCP通信全流程**:从套接字创建到连接终止; 2. **并发服务器设计**:多进程/多线程模型实现; 3. **健壮性处理**:应对网络异常与资源管理; 4. **调试技巧**:使用工具分析协议交互。

SEU123WW的博客 1055

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

linux网络编程之socket(十五):UNIX域套接字编程和socketpair 函数

一、UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、

Meditation 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

《unix网络编程》(18)基本UDP套接字 简单客户服务器回射程序及改进

基本TCP套接字参考《unix网络编程》(8)基本TCP套接字 套接字函数 #include #include ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *addrlen); ssize_t

Sunshine的专栏 2086

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

《UNIX环境高级编程》笔记--UNIX域套接字

1.非命名的UNIX域套接字 UNIX套接字用于在用一台机器上运行的进程之间通信。UNIX套接字比因特网域套接字的效率更高。UNIX与套接字提供和 数据报两种接口,UNIX域数据报服务是可靠的,就不会丢失消息也不会传递出错。UNIX域套接字是套接字和管道之间的混合物。 为了创建一对非命名的,相互连接的UNXI域套接字,用户可以使用socketopair函数。   #include in

tycoon的专栏 619

UNIX网络编程——UNIX域套接字编程和socketpair 函数

一、UNIX Domain Socket IPC       socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校

ctthuangcheng 2521

Unix 网络编程(四)- 典型TCP客服服务器程序开发实例及基本套接字API介绍

转载:http://blog.youkuaiyun.com/michael_kong_nju/article/details/43457393 写在开头: 在上一节中我们学习了一些基础的用来支持网络编程的API,包括“套接字的地址结构”、“字节排序函数”等。这些API几乎是所有的网络编程中都会使用的一些,对于我们正确的编写网络程序有很大的作用。在本节中我们会介绍编写一个基于TCP的套接字程

sinat_35297665的博客 249

Linux网络编程之socket:unix域套接字编程与socketpair函数

一、UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、

Mr_weng 912

《unix网络编程》(9)TCP客户/服务器示例:TCP回射

源码 利用文章《《unix网络编程》(8)基本TCP套接字》中的套接字函数可以设计一个如下简单的客户服务器的例子。 //服务器端tcpsrv01.c #include "../myheader.h" /* 从客户端读入数据,并将数据回射到客户端。 */ void str_echo(int sockfd) { ssize_t n; char buf[1024]; aga

Sunshine的专栏 1938

《UNIX网络编程 卷1:套接字联网API(第3版)》——8.7 数据报的丢失

本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第8章,第8.7节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看 8.7 数据报的丢失 我们的UDP客户/服务器例子是不可靠的。如果一个客户数据报丢失...

weixin_33937778的博客 98
上一篇: Linux下Python递归文件目录
下一篇: 枚举、结构体、联合体的简单应用程序-C语言
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值