配套环境
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站)



















