UNIX网络编程卷1(第三版) 客户/服务器程序示例

简介: UNIX网络编程卷1(第三版) 客户/服务器程序示例

1.TCP回射服务器程序:main函数

#include  "unp.h"
int
main(int argc, char **argv)
{
  int     listenfd, connfd;
  pid_t    childpid;
  socklen_t   clilen;
  struct sockaddr_in  cliaddr, servaddr;
  void    sig_chld(int);
  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, (SA *) &servaddr, sizeof(servaddr));
  Listen(listenfd, LISTENQ);
  Signal(SIGCHLD, sig_chld);
  for ( ; ; ) {
  clilen = sizeof(cliaddr);
  if ( (connfd = accept(listenfd, (SA *) &cliaddr, &clilen)) < 0) {
    if (errno == EINTR)
    continue;  /* back to for() */
    else
    err_sys("accept error");
  }
  if ( (childpid = Fork()) == 0) {  /* child process */
    Close(listenfd);  /* close listening socket */
    str_echo(connfd); /* process the request */
    exit(0);
  }
  Close(connfd);    /* parent closes connected socket */
  }
}


创建TCP套接字。在待绑定到该套接字的网际网套接字地址结构中填入通配地址(INADDR_ANY)和服务器众所周知的端口(SERV_PORT).捆绑通配地址是告诉系统:要是系统是多宿主机,我们将接受目的地址为任何本地接口的连接。listen把该套接字转成一个监听套接字。


服务器阻塞于accept调用,等待客户端连接完成。


fork为每个客户派生给一个处理它们的子进程。子进程关闭监听套接字,父进程关闭已连接的套接字。。子进程调用str_echo处理客户。

#include "unp.h"
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)
        errr_sys("str_echo:read error");
}


read函数从套接字读入数据,writen函数把其内容回射给客户。如果客户关闭连接,那么接收到客户的FIN将导致服务器子进程的read函数返回0,这又导致str_echo函数的返回,从而终止子进程。


2.TCP回射客户程序:main函数

/* Use standard echo server; baseline measurements for nonblocking version */
#include  "unp.h"
int
main(int argc, char **argv)
{
  int     sockfd;
  struct sockaddr_in  servaddr;
  if (argc != 2)
  err_quit("usage: tcpcli <IPaddress>");
  sockfd = Socket(AF_INET, SOCK_STREAM, 0);
  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(7);
  Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
  Connect_timeo(sockfd, (SA *) &servaddr, sizeof(servaddr), 10);
  str_cli(stdin, sockfd);  /* do it all */
  exit(0);
}


3.POSIX信号处理


信号就是告知某个进程发生了某个事件的通知,有时候也称为软件中断,信号通常是异步的,也就是进程预先不知道信号的准确发生时刻。


信号可以:由一个进程发给另一个进程或者自身;由内核发给某个进程。


每个信号都有一个与之关联的处置,也称为行为。

目录
相关文章
|
8月前
|
Windows
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序
235 2
|
9月前
|
Windows
Windows下版本控制器(SVN)-启动服务器端程序
Windows下版本控制器(SVN)-启动服务器端程序
337 4
|
10月前
|
Linux 数据安全/隐私保护
使用Linux命令行接入无线网络Wi-Fi的示例。
现在,你已经使用命令行成功地连接到 Wi-Fi 网络了。这两个示例涵盖了用 `nmcli` 和 `wpa_supplicant` 连接无线网络的常见场景,让你能够不依赖图形化界面来完成这个任务。在日常使用中熟练掌握这些基本操作能增强你对 Linux 系统的理解,帮助你更有效地处理各种问题。
789 12
|
弹性计算 开发工具 git
2分钟在阿里云ECS控制台部署个人应用(图文示例)
作为一名程序员,我在部署托管于Github/Gitee的代码到阿里云ECS服务器时,经常遇到繁琐的手动配置问题。近期,阿里云ECS控制台推出了一键构建部署功能,简化了这一过程,支持Gitee和GitHub仓库,自动处理git、docker等安装配置,无需手动登录服务器执行命令,大大提升了部署效率。本文将详细介绍该功能的使用方法和适用场景。
2分钟在阿里云ECS控制台部署个人应用(图文示例)
|
安全 编译器 Linux
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例
本文深入解析了利用缓冲区溢出漏洞对FTP服务器进行远程攻击的技术,通过分析FreeFlow FTP 1.75版本的漏洞,展示了如何通过构造过长的用户名触发缓冲区溢出并调用计算器(`calc.exe`)。文章详细介绍了攻击原理、关键代码组件及其实现步骤,并提出了有效的防范措施,如输入验证、编译器保护和安全编程语言的选择,以保障系统的安全性。环境搭建基于Windows XP SP3和Kali Linux,使用Metasploit Framework进行攻击演示。请注意,此内容仅用于教育和研究目的。
479 4
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
583 6
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
1054 1
|
JavaScript Linux 开发工具
如何将nodejs项目程序部署到阿里云服务器上
该文章详细描述了将Node.js项目部署到阿里云服务器的步骤,包括服务器环境配置、项目上传及使用PM2进行服务管理的过程。
|
Unix API 索引
《UNIX网络编程 卷1:套接字联网API(第3版)》——1.6 本书中客户/服务器程序示例索引表
为了提供本书所涵盖不同主题的路线图,我们用下面4个表格汇总了将要开发的程序,并给出了它们的源代码所在的起始图号。图1-10列出了本书开发的时间获取客户程序的不同版本,其中有两个版本前面已讲过。图1-11列出了时间获取服务器程序的不同版本。
1934 0
|
Unix Shell Linux
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
261 2