问题:如何进行网络编程?
网络编程的实质
应用操作系统提供的接口函数,使得应用程序具备收发网络数据的能力
网络接口在代码层面是操作系统提供的函数
- 网络编程只是一系列零碎函数的花式玩法
应用程序通过网络接口应用操作系统的联网能力
- 网络编程是特定畛域(网络)的 C 语言程序设计
协定:为进行数据通讯而预约义的数据规定
地址:网络通讯中的用于标识设施的整数值(“xxx.xxx.xxx.xxx” 4字节整形值可示意,单为了更容易记忆,转换为字符串)
端口号
- 设施为收发数据而指定的数值,用于示意具体连贯
- 可了解为:设施中用于网络通讯的数据通道
- 如:一台电脑往往只领有一个 IP 而又有多个应用程序,此时就应用端口进行辨别
角色
- 服务端:期待连贯设施
- 客户端:发动连贯的是恶被
ps : 一台设施可同时作为客户端和服务端
网络常识充电站
网址就是 IP 地址吗? URL 是什么,域名又是什么?
- 网址不是 IP 地址,是指网络信息资源的地址(如:具体网页的地址),即:URL
- 域名是 IP 地址的名别,多个域名能够指向同一个 IP 地址
- 域名 → DNS → IP 地址
协定肯定是看不懂的二进制数据吗?
- 协定是一种约定,即:事后定义的规定
- 协定能够基于文本定义,也能够基于二进制定义
小端系统:采纳小端模式(little-endian)的零碎,即:数据低字节放在内存低地址中
0x12345678 int 4字节低地址 |78|56|34|12| 高地址
大端系统:采纳大端模式(big-endian)的零碎,即:数据低字节放在内存高地址中
0x12345678 int 4字节低地址 |12|34|56|78| 高地址
网络字节序:网址字节程序采纳大端模式,所以,在小端系统中须要做字节转换
网络编程模式
1. 筹备连贯2. 连贯近程设施3. 收发数据4. 敞开丽娜姐
初探网络编程接口
#include <sts/types.h>
#include <sys/socket.h>
函数原型 | 性能形容 |
int socket(int domain, int type, int protocal); | 创立套接字,为网络连接做筹备 |
int connect(int socket, struct sockaddr *addr, socklen_t len); | 连贯指定地址的近程设施 |
ssize_t send(int fd, const void *buf, size_t n, int flags); | 发送数据到近程设施 |
ssize_t recv(int fd, void *buf, size_t n, int flags); | 接管近程设施发回的数据 |
int close(int fd); | 敞开连贯,销毁套接字 |
编程试验:网络编程初体验
#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <unistd.h>#include <string.h>int main(void){ int sock = 0; struct sockaddr_in addr = {0}; char *tosend = "GET /index.html HTTP/1.1\nHOST: www.dt4sw.com\nUser-Agent: TEST\nConnection: close\n\n"; int len = 0; char buf[128] = {0}; int r = 0; sock = socket(PF_INET, SOCK_STREAM, 0); if (sock == -1) { printf("socket error\n"); return -1; } addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("47.99.217.175"); addr.sin_port = htons(80); if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) { printf("connected error\n"); return -1; } printf("connect success\n"); len = send(sock, tosend, strlen(tosend), 0); printf("send bytes = %d\n", len); len = 0; do { int i = 0; r = recv(sock, buf, sizeof(buf), 0); if (r > 0) { len += r; } for (i=0; i<r; ++i) { printf("%c", buf[i]); } } while (r > 0); printf("\n"); printf("recv bytes = %d\n", len); return 0;}
输入:
./a.out connect successsend bytes = 81HTTP/1.1 200 OKContent-Type: text/html............ <script src="./static/js/app.js"></script></body></html>recv bytes = 22382
思考:这次所编写的网络程序是什么角色?
答:客户端