问题:如何进行网络编程?
网络编程的本质
使用操作系统提供的接口函数,使得应用程序具备收发网络数据的能力
网络接口在代码层面是操作系统提供的函数
- 网络编程只是一系列系统函数的花式玩法
应用程序通过网络接口使用操作系统的联网能力
- 网络编程是特定领域(网络)的 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
思考:这次所编写的网络程序是什么角色?
答:客户端
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。