CSAPP笔记(第十一章 网络编程01)

第十一章的内容为p677~p713. 分2部分, p677~p699, p700~p713.

摘要

网络

集线器: 主机之间用集线器连接
网桥: 集线器之间用网桥连接
路由器: 不兼容的局域网之间用路由器连接

网络协议: 通过统一协议实现不同网络间的通信

因特网3特性:

  1. 主机集合被映射为一组32位的IP地址.
  2. 这组IP地址被映射位一组称为因特网域名(IP)的标识符
  3. 因特网主机上的进程能够通过连接和其他因特网主机上的进程通信

IP

一个IP地址是一个32位无符号整数

struct in_addr {
    uint32_t s_addr;
}

IP地址总是以大端法网络字节顺序存放的.

域名是IP地址的别名, 能够以容易记忆的地址访问. 直到1988年, 域名与IP的映射都是通过一个HOSTS.TXT的文本文件来手工维护的. 后来通过一个而分布到世界范围内的数据库(DNS)来维护的. 域名与IP的映射是多对多的, 一个域名可以对应多个IP, 一个IP也可以对应多个域名.

套接字

一个套接字是连接的一个断点, 由一个因特网地址和一个16位的整数端口组成, 用"地址: 端口"表示.
客户端的端口是临时分配的, 称为临时端口(ephermeral port), 服务器端的是固定端口. 一个连接由它两端的套接字地址唯一确定的, 这对套接字地址叫做套接字对(socket pair), (cliaddr:cliport, servaddr:servport)

struct sockaddr_in {
    uint16_t sin_family;
    uint16_t sin_port;
    struct in_addr sin_addr;
    unsigned char sin_zero[8];
}

struct sockaddr {
    uint16_t sa_family;
    char sa_data[14];
}

socket函数, 创建一个套接字描述符(socket descriptor), clientfd = Socket(AF_INET, SOCK_STREAM, 0);

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

connect函数, 客户端通过connect来建立和服务器的连接

#include <sys/socket.h>
int connect(int clientfd, const struct sockaddr *addr, socklen_t addrlen);

bind函数, bind, listen, accept, 服务器用它们来和客户端建立连接.

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

listen函数

#include <sys/socket.h>
int listen(int sockfd, int backlog);

accept函数, 服务器通过调用accept等待来自客户端的连接请求.

#include <sys/socket.h>
int accept(int listenfd, struct sockaddr *addr, int *addrlen);

套接字连接的辅助函数

open_clientfd函数, 客户端调用该函数建立与服务器的连接, 成功的话返回描述符, 否则返回-1

#include "csapp.h"
int open_clientfd(char *hostname, char *port);

open_listenfd函数, 服务器创建一个监听描述符, 准备好接收连接请求

#include "csapp.h"
int open_listenfd(char *port);

code

从网上找了段c# socket的代码, csharp socket demo

posted @ 2019-12-09 09:24  Panda110  阅读(188)  评论(0编辑  收藏  举报