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信号处理


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


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


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

目录
相关文章
|
25天前
|
存储 网络协议 Ubuntu
【C++网络编程】Socket基础:网络通讯程序入门级教程
【C++网络编程】Socket基础:网络通讯程序入门级教程
49 7
|
25天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
2天前
|
网络协议 物联网 数据处理
【C 言专栏】C 语言实现网络通信程序
【5月更文挑战第4天】本文探讨了使用C语言实现网络通信程序的方法,包括理解网络通信基本概念如协议和套接字,以及TCP/UDP通信的实现步骤。通过创建套接字、绑定端口、监听连接、数据传输和错误处理等关键环节,阐述了C语言在网络通信中的优势。文中还提到了实际应用案例、程序优化策略及未来发展趋势,旨在帮助读者掌握C语言在网络通信领域的应用技巧。
【C 言专栏】C 语言实现网络通信程序
|
6天前
|
存储 数据处理 数据库
|
8天前
|
存储 缓存 网络协议
【专栏】DNS服务器是否可以加快我们的网络访问速度
【4月更文挑战第28天】本文探讨了DNS服务器是否能加快网络访问速度。DNS负责将域名转换为IP地址,其查询时间、缓存机制和地理位置都影响网络速度。优化DNS配置,如选择快速的公共DNS服务、使用附近的服务器、确保设备正确配置和利用DNS缓存,都能有效提升网络体验。理解并优化DNS设置对于提高网络速度至关重要。
|
9天前
|
监控 负载均衡 网络协议
|
17天前
|
存储 数据采集 NoSQL
使用Python打造爬虫程序之数据存储与持久化:从网络到硬盘的无缝对接
【4月更文挑战第19天】本文探讨了爬虫中的数据存储与持久化技术,包括文本文件存储、数据库(关系型与非关系型)、NoSQL数据库和键值存储,以及ORM框架的使用。根据数据类型、规模和访问需求选择合适存储方式,并注意数据安全、备份和恢复策略。正确选择和应用这些技术能有效管理和利用爬取数据。
|
26天前
|
算法 测试技术 C#
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(三)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(二)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目
|
26天前
|
人工智能 BI 测试技术
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(一)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目