UNP --- 第一章 介绍

一个简单的时间获取客户端程序

 1 #include "unp.h"
 2
 3 int main(int argc, char **argv)
 4 {
 5     int sockfd, n;
 6     char recvline[MAXLINE + 1];
 7     struct sockaddr_in servaddr;
 8
 9     if (argc != 2)
10     {
11         err_quit("usage: a.out <IPaddress>");
12     }
13     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
14     {
15         err_sys("socket error");
16     }
17
18     bzero(&servaddr, sizeof(servaddr));
19     servaddr.sin_family = AF_INET;
20     servaddr.sin_port = htons(13);
21     if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
22     {
23         err_quit("inet_pton error for %s", argv[1]);
24     }
25     if (connect(sockfd, (SA *)&servaddr, sizeof(servaddr)) < 0)
26     {
27         err_sys("connect error");
28     }
29
30     while ((n = read(sockfd, recvline, MAXLINE)) > 0)
31     {
32         recvline[n] = 0;
33         if (fputs(recvline, stdout) == EOF)
34         {
35             err_sys("fputs error");
36         }
37     }
38     if (n < 0)
39     {
40         err_sys("read error");
41     }
42 }
  1. socket函数创建一个网际(AF_INET)字节流(SOCK_STREAM)套接字,即TCP套接字(TCP端点)
  2. 需要将服务器的IP地址和端口号填入sockaddr_in结构变量中,用以指定服务器套接字相关信息。该变量的地址族为AF_INET,端口号为13(时间获取服务器的知名端口)。
  3. htons用来转换二进制端口号,inet_pton将IP地址字符串转换为数值。
  4. connect函数应用于一个TCP套接字时,将与它参数中套接字指定的服务器建立TCP连接。
  5. 使用read循环读取服务器的应答。因为TCP是一个没有记录边界的字节流协议,所以daytime服务器的26个字节可以有多种返回方式,不能确保一次read就能完成所以读取。当read返回0(表示对端关闭连接)或负数(表示发生错误)时,终止循环。

错误处理:包裹函数

对于每个函数调用,都必须检查是否返回错误。当发生错误时,就使用函数输出错误信息并终止程序运行。通过定义包裹函数来完成实际的函数调用,检查返回值,并在发生错误时终止程序。如:

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

一个简单的时间获取服务器程序

#include "unp.h"
#include <time.h>

int main(int argc, char* argv[])
{
    int listenfd, connfd;
    struct sockaddr_in servaddr;
    char buff[MAXLINE + 1];
    time_t ticks;

    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(13);

    Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
    Listen(listenfd, LISTENQ);

    while(1) {
        connfd = Accept(listenfd, NULL, NULL);
        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        Write(connfd, buff, strlen(buff));
        Close(connfd);
    }
}
  1. 调用bind函数,服务器的知名端口(13)被绑定到套接字中。IP地址为INADDR_ANY,这样要是服务器主机有多个网络接口,服务器进程就可以在任意网络接口上接受客户连接。
  2. 调用listen函数把套接字变为监听套接字。
  3. 服务器进程在accept函数中被投入休眠,等待某个客户的连接到达并被内核接受。TCP使用三次握手建立连接,建立完成后accept返回,返回值是已连接描述符,用于与新连接的客户通信。
  4. time返回秒数,ctime将该整数值变为直观可读的格式。
  5. snprintf的第二个参数指定缓冲区的大小。

网络拓扑相关命令

  1. netstat -i提供网络接口的信息。
  2. netstat -r展示路由表。
  3. ifconfig + 接口名字,可获得各接口的详细信息。
  4. 为了找出本地网络众多主机IP地址,可ping本地接口的广播地址。

原文地址:https://www.cnblogs.com/hlk09/p/10356967.html

时间: 2024-08-01 00:18:56

UNP --- 第一章 介绍的相关文章

第一章—介绍

和所有其他并发书籍一样这本书开头也是列举了自增运算符在多并发场景下的可能出现的错误. 原子性: 对于自增运算,现代的任何一个计算机都会把这个操作实现成三步:从内存加载数据到寄存器,增加寄存器中的数据,然后再把增加之后的数据写入到内存. 如果我们的计数器初始值是0的话,在正常情况下,当两个线程执行完成之后,我们会得到2.但是如果一个现在在另一个线程执行第三步之前率先执行了第一步的话,两个线程都会往内存存入1,这样另一个线程的增加就会被丢失掉(不会得到2). 同步是一门用来防止程序进行错误交叉执行路

perl进阶中文版 第一章 介绍

翻译尊重原版,以自己的方式最大化地阐述原版内容. 更多内容请访问www.from0701.com.每周更新两章. 欢迎来到perl学习的下一阶段.你来这儿的理由可能是你想编写100行以上的代码或者仅仅是你的老板要求你这么做. 我们的<perl语言入门>如此伟大是因为他介绍了如何用perl编写中小型程序(在我们看来,这是perl最普遍的用途).但是为了不让我们的“小骆驼书”太厚重,我们有意并且小心地移除了很多内容. 接下来,我们将用和小骆驼书一样的风格去继续我们的故事.这儿包含了编写100-10

python 第一章 介绍-1.python特点.

一.Python特点 开源免费 脚本语言,解析执行 跨平台 高级语言,面向对象,可扩展,可移植性用于在不同的平台(因为Python是用C写的,又由于C的可移植性) 内存管理器在Python中,由于内存管理是由Python解释器负责的,所以开发人员就可以从内存事物中解放出来,全神关注于直接目标.解释性语言,不需要编译,连接成可执行的exe文件代码 Google后台就是用Python写的,现在国内大型软件公司的后台基本 它的特点如下: ------------------------- 1.高级编程

第一章 Android系统的编译和移植实例

第一章 Android系统的编译和移植实例 这一章节主要介绍了Android系统的编译和移植技术,作为建立在Linux内核的基础上的Android操作系统,它的编译和移植不论在过程还是技术方面都和嵌入式Linux非常相似. 首先要准备一套可以正常运行Linux系统的一套开发版,需要在其移植Android系统,并能够正常运行. 移植的主要过程为: 1.下载Android Linux 内核 2.安装交叉工具链 3.移植Android Linux 内核支持的平台 4.安装Android SDK 5.获

ASM学习笔记--ASM 4 user guide 第一章翻译

第一章 介绍 1.1动机 程序分析.生成和转换是非常有用的技术,它具有以下的应用场景: l  程序分析(包括从简单的综合性分析到一个全面的语义分析)可以被用来寻找潜在的bug,发现未使用的代码,进行工程代码的逆向. l  程序生成被用在编译器当中.这包括传统的编译器,也包括为分布式编程使用的stub或skeleton 编译器,即时编译器等 l  程序转换可以被用来优化或者混淆程序,为程序插入debugging或者性能检测代码,方便面向对象编程等. 所有这些技术可以被用到任意的编程语言,但是难易程

Android深度探索读后感 第一章

第一章 介绍Android驱动开发和移植技术 一.Android的四层系统架构: Android的系统架构分为4层,分别为:Linux内核,C/C++代码库,Android SDK API,应用程序. Linux内核:Linux内核包括Linux的驱动以及内存管理,进程管理,电源管理等程序. Linux的驱动:驱动就是驱使硬件设备行动.驱动是直接与底层硬件直接打交道,按照一定的工作方式,读写设备的寄存器,具有完成设备的轮询.中断处理.DMA通信,进行物理内存向虚拟内存的映射等功能,最终让通信设备

Delphi基本之pascal语法(第一章.pascal介绍)

第一章.pascal介绍一.pascal的基本语法单位 1.基本符号 A——Z:a——z:0——9:+,-,*,/,=,<>,<=,>=,<,>,(,),[,],{,},:=,,,:,.,:,..,',^ 注意:pascal语言除了能使用以上规定的基本符号外,不得使用任何其它符号. 2.保留字 AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DIWNTO,ELSE,END,FILE,FOR,FUNTION,GOTO,IF,LABEL,MOD,NIL,

Camel In Action 阅读笔记 第一章 认识Camel 1.1 Camel 介绍

1.1 Camel 介绍 Camel 是一个为了您的项目集成变得高效有趣的集成框架,Camel 项目在2007年初开始的,相对来说它还比较年轻,但它已然是一个非常成熟的开源项目,它所使用的是Apache 2开源License, 其背后的社区非常强大. Camel主要目的就是简化集成,当您用心读完本书以后,您会很感谢Camel并把它做为您的一个必需技能. Apache Camel这个项目之所以命名为Camel的主要原因是因为简单好记,有一个小道说法是项目创建者之一在吸了一个叫"骆驼"牌的

The Book of CSS3 中文版 第一章:介绍CSS3

在这一章,为了展示本书所用的代码约定我会介绍一些新的CSS3属性,但在此之前我想简要说明下CSS3的历史.很想然你不需要为了使用CSS3去了解它的历史,但是我认为有一些关于CSS3当前状态的背景是很重要的. CSS3是一个在变化的规范.规范的一部分被认为是稳定的并且在现代浏览器中得到了很好的实现:规范的另一部分应当作实验性的并且被部分地不同程度的实现:还有一部分则仍然是理论上的提议,并且没有得到任何实现.一些浏览器创建了它们自己的CSS属性,这些属性不属于任何CSS3规范也许将来也不会添加进去.