• 【Linux网络编程】网络编程初体验



    前言

    虚拟机类型:Ubuntu 20.04.1,代码编写:vs code
    windows连接工具NetAssist:链接:https://pan.baidu.com/s/1e3dKPh7N5bo0dli84O_TuA?pwd=mndp
    提取码:mndp

    前提:会C语言


    提示:以下是本篇文章正文内容,下面案例可供参考

    目标与安排

    为什么要学习网络编程:
    实践必备技能

    时代必备技能:
    几乎所有的操作系统都支持网络功能
    几乎所有的app都要联网才能工作
    互联网时代->移动互联网时代->物联网时代…

    课程目标:
    掌握网络协议的本质和socket的本质
    掌握C/S等模型
    掌握TCP和UDP网络编程…

    Are You ready?
    Let`s go!

    网络编程核心概念与模式

    如何进行网络编程?
    使用操作系统的接口函数,使得程序具备网络数据收发的能力

    本质:
    只是一系列的系统函数的花哨玩法
    网络编程是特定领域的C语言程序设计

    核心概念

    协议:为数据通信而预定的规则
    地址:用于表示设备的整数值
    端口号:
    设备的收发数据而指定的整数值,用于标识具体连接

    角色:
    客户端:发起连接的设备
    服务端:等待连接的设备

    网络编程模式:

    1、准备网络连接
    2、连接运程设备
    3、收发数据
    4、关闭连接
    
    • 1
    • 2
    • 3
    • 4

    初探网络编程接口

    int socket(int dimain,int type,int protocal);创建套接字,为网络连接做准备
    
    int connect(int sock,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);关闭连接,销毁套接字
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    客户端编程初体验

    注:远端ip地址为:47.103.24.173(bilibili.com),端口号80

    //头文件
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    定义socket变量int sock = 0;
    定义sockaddr_instruct sockaddr_in addr = {0};
    定义发送的内容char * tosend = "Get\n\n";注意:发送的内容最后需要2次换行,服务端才会理你
    定义接受缓冲区:char buf[128]={0};
    以及接受发送,循环控制变量int len = 0;int r = 0;

    创建socket并判断

    	sock = socket(PF_INET, SOCK_STREAM, 0);
    
        if( sock == -1 )
        {
            printf("socket error\n");
            return -1;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    赋值sockaddr_in

    addr.sin_family = AF_INET;//和socket创建的参数1一样
        addr.sin_addr.s_addr = inet_addr("47.103.24.173");//ip地址
        addr.sin_port = htons(80);//端口号
    
    • 1
    • 2
    • 3

    连接:

    if( connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1 )
        {
            printf("connect error\n");
            return -1;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    发送数据服务端

    	len = send(sock, tosend, strlen(tosend), 0);
    
        printf("send bytes = %d\n", len);
    
    • 1
    • 2
    • 3

    接收服务端发来的源码

    	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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    最后不要忘记了close(sock);

    此时,我们运行,屏幕上就有html的源代码显示

    The End

    完整代码的展示:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main()
    {
        int sock = 0;
        struct sockaddr_in addr = {0};
        char* tosend = "Get\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.103.24.173");
        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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
  • 相关阅读:
    陈可之国画|《同杯万古尘》
    Python股票量化投资课学习记录1
    关于个人职业的随笔
    单例模式的介绍
    【一周安全资讯1014】交通运输部发布《公路工程设施支持自动驾驶技术指南》;多地网信办对违反数据安全法规企业作出行政处罚
    运营商三要素核验接口-手机实名验证API
    java《ArrayList篇》--ArrayList全套知识点总结及其配套习题逐语句分析(附带全套源代码)
    [蓝桥杯 2013 省 AB] 错误票据
    Java如何使用dom4j获取,添加,删除,查找,设置Element节点呢?
    cesium 源码解析 ShaderProgram
  • 原文地址:https://blog.csdn.net/m0_62599305/article/details/128165898