问题:如何进行网络编程?
网络编程的实质
应用操作系统提供的 接口函数 ,使得应用程序具备 收发网络数据 的能力
网络接口在代码层面是操作系统提供的函数
- 网络编程只是一系列零碎函数的花式玩法
应用程序通过网络接口应用操作系统的联网能力
- 网络编程是特定畛域(网络)的 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 success
send bytes = 81
HTTP/1.1 200 OK
Content-Type: text/html
......
......
<script src="./static/js/app.js"></script>
</body>
</html>
recv bytes = 22382
思考:这次所编写的网络程序是什么角色?
答:客户端