配套环境
vscode、gcc、ubuntu22.04
概念描述
- 网络编程的本质
使用操作系统提供的接口函数,使得应用程序具备收发网络数据的能力。
网络接口在代码层面是操作系统提供的函数
应用程序通过网络接口使用操作系统的联网能力
- 网络编程核心概念
协议:为进行数据通信而预定义的数据规则
地址:网络通信中用语标识设备的整数值
端口号:设备为收发数据而指定的数值,用于标识具体连接,可理解为设备中用于网络通信的数据通道
角色:服务端--等待连接的设备
客户端--主动发起连接的设备
- 网络知识充电站
网址就是IP地址吗?URL是什么,域名又是什么?
- 网址不是IP地址,是网络信息资源的地址(PS: 具体网页的地址),即URL
- 域名是IP地址的别名,多个域名可以指向同一个IP地址
协议一定是看不懂的二进制数据吗?
- 协议是一种约定,即预先定义的规则
- 协议可以基于文本定义,也可以基于二进制定义
小端系统:采用小端模式(little-endian)的系统,即:数据低字节放在内存低地址中
大端系统:采用大端模式(big-endian)的系统,即:数据低字节放在内存高地址中
网络字节序:网络字节顺序采用大端模式,所以:在小端系统中需要做字节序转换
网络编程模式
- 准备网络连接
- 连接远程设备
- 收发数据
- 关闭连接
实验代码
#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()
{
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("connect 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);
close(sock);
return 0;
}
喝水不忘挖井人: 更多内容请搜索狄泰软件学院(淘宝/B站)