UNIX网络编程卷一 学习笔记 第一章 简介

一般认为web服务器是一个长时间运行的程序(即守护程序),它只在响应来自网络的请求时才发送网络消息。

大多网络应用都是由客户进程发起通信请求,确定这一点有助于简化协议和程序。一些较为复杂的网络还需异步回调通信,即由服务器向客户发起请求信息。

通过网络通信的程序编写时要先确定程序相互通信所用的协议。

一个服务器可同时处理多个客户请求。

UNIX网络编程卷一 学习笔记 第一章 简介_第1张图片
客户和服务器无需如上图一样都处于一个局域网,可通过路由器将两个局域网连接到广域网:
UNIX网络编程卷一 学习笔记 第一章 简介_第2张图片
最大的广域网是因特网。

向服务器查询时间:

#include 
#include 
#include 
#include 
#include 
#include 

#define MAXLINE 512

int main(int argc, char **argv) {
    int sockfd, n;
    char recvline[MAXLINE + 1];
    struct sockaddr_in servaddr;    // 此结构位于头文件netinet/in.h

    if (argc != 2) {
        printf("usage: a.out \n");
		exit(1);
    }

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {    // 创建一个网际(AF_INET)字节流(SOCK_STREAM)套接字,即TCP套接字
        printf("socket error\n");
		exit(1);
    }

    bzero(&servaddr, sizeof(servaddr));    // 位于头文件string.h,把指定字节大小的地址区域都置为0字节
    servaddr.sin_family = AF_INET;    // 置地址族为AF_INET
    servaddr.sin_port = htons(13);    // daytime server的端口号,htons将整型变量从主机字节顺序转变成网络字节顺序(高位字节存在低地址处)
    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {    // 该函数将点分十进制IP地址转换为二进制
        printf("inet_pton error for %s\n", argv[1]);
		exit(1);
    }
    
    // connect函数与它的第二个参数指向的套接字地址结构所指定的服务器建立TCP连接,第三个参数是这个套接字地址结构的长度
    if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {    // sockaddr位于头文件sys/socket.h
        printf("connect error\n");
		perror("connect");
		exit(1);
    }

    // 此处需要while循环,因为服务器可能会将TCP分节,我们一次只能读取单个分节,需要一直读取,直到返回0(对端关闭连接)或负数(发生错误),此程序中,服务器关闭连接表示记录接收结束
    while ((n = read(sockfd, recvline, MAXLINE)) > 0) {
        recvline[n] = 0;    // null terminate
        if (fputs(recvline, stdout) == EOF) {
		    printf("fputs error\n");
		    exit(1);
		}
    }
    if (n < 0) {
        printf("fputs error\n");
    }

    exit(0);    // 结束程序,内核会关闭所有打开的文件描述符,套接字就此被关闭
}

我们以上使用的网络API称为套接字API(socket API),如函数socket。

daytime服务器的应答通常如下:
在这里插入图片描述
TCP本身不提供记录结束标志,应用需要自己实现记录边界的确定。

以上程序是协议相关的,它初始化一个sockaddr_in结构,并将该结构的协议族成员设为AF_INET,socket函数的第一个参数也是AF_INET。

IPv4数据报最大长度为65535字节,IPv6数据报最大长度为65575字节。

你可能感兴趣的:(UNIX网络编程卷一(第三版))