第四章 Linux网络编程(1)

本文介绍了网络通信的基础知识,包括网络结构模式、MAC和IP地址、端口的作用。讨论了网络模型和协议的重要性,并详细讲解了字节序的概念,区分了大端和小端字节序。同时,通过示例代码展示了如何检测主机字节序以及如何使用字节序转换函数htons、ntohs、htonl和ntohl在网络通信中进行字节序转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 网络结构模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、 MAC地址、IP地址、端口

网卡有两种:以太网卡和无线网卡
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
ip+端口:ip是为了让电脑a找到电脑b,端口是为了让电脑a中的qq给电脑b中的qq发送信息,而不是发送给电脑b中的微信。
利用端口号找到某个进程并与之通信
在这里插入图片描述

三、 网络模型

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

四、 协议

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五、 网络通信的过程

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

六、 socket介绍

在这里插入图片描述
在这里插入图片描述

7 字节序

在这里插入图片描述
在这里插入图片描述

/*  
    字节序:字节在内存中存储的顺序。
    小端字节序:数据的高位字节存储在内存的高位地址,低位字节存储在内存的低位地址
    大端字节序:数据的低位字节存储在内存的高位地址,高位字节存储在内存的低位地址
*/

// 通过代码检测当前主机的字节序
#include<stdio.h>

int main(){

    union{
        short value; //2字节
        char bytes[sizeof(short)]; // char[2]
    }test;

    test.value = 0x0102;
    if((test.bytes[0] == 1) && (test.bytes[1] == 2)){
        //高位字节存储在内存地位地址
        printf("大端字节序\n");
    }else if( (test.bytes[0] == 2) && (test.bytes[1] == 1)){
        //高位字节存储在内存的高位地址
        printf("小端字节序\n");
    }else {
        printf("未知错误\n");
    }

    return 0;

}

8 字节序转换函数

在这里插入图片描述
在这里插入图片描述

/*

    网络通信时,需要将主机字节序转换成网络字节序(大端),
    另外一段获取到数据以后根据情况将网络字节序转换成主机字节序。

    // 转换端口
    uint16_t htons(uint16_t hostshort);		// 主机字节序 - 网络字节序
    uint16_t ntohs(uint16_t netshort);		// 主机字节序 - 网络字节序

    // 转IP
    uint32_t htonl(uint32_t hostlong);		// 主机字节序 - 网络字节序
    uint32_t ntohl(uint32_t netlong);		// 主机字节序 - 网络字节序

*/

#include<stdio.h>
#include<arpa/inet.h>

int main(){
    // htons 转换端口uint16_t
    // 一般情况网络通信没有负数,所以一般使用unsigned无符号的整数
    unsigned short a = 0x0102;
    printf("a : %x\n",a);
    unsigned short b = htons(a);
    //以16进制来打印
    printf("b : %x\n",b);

    printf("====================\n");

    // htonl 转换ip uint32_t
    char buf[4] = {192,168,1,24};
    int num = *(int *)buf; //变成了int型的指针
    
    unsigned int sum = htonl(num);

    unsigned char *p = (char *)&sum; //char 一个字节
    printf("%d,%d,%d,%d\n",*p,*(p+1),*(p+2),*(p+3));

    printf("====================\n");

    // ntohs
    unsigned short c = 0x0302;
    printf("c : %x\n",c);
    unsigned short d = ntohs(c);
    printf("d : %x\n",d);

    printf("====================\n");

    //ntohl
    char buf1[4] = {100,2,168,192};
    int num1 = *(int *)buf1;
    unsigned int sum1 = ntohl(num1);
    unsigned char *p1 = (char *)&sum1;
    printf("%d,%d,%d,%d \n",*p1,*(p1+1),*(p1+2),*(p1+3));


    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值