自学内容网 自学内容网

Webserver(4.2)socket通信基础

socket

套接字,与管道类似,应用于网络进程间数据的传递。而管道主要应用于本地进程间的通信
服务器端被动接受连接,一般不会主动发起连接。客户端主动向服务器发起连接。就像一个插座一样。

字节序

小端字节序:整数的低位字节存储在低位地址,整数的高位字节存储在内存的高位地址
目前大部分计算机都用的小端字节序,当然也有例外用的大端字节序。如果不同计算机通信时用的字节序不一样,那么就会出问题

#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;
}

在这里插入图片描述

字节序转换函数

htons 转换端口

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

int main(){

    //htons
    unsigned short a=0x0102;
    unsigned short b=htons(a);
    printf("a:%x\n",a);
    printf("b:%x\n",b);



    return 0;
}

在这里插入图片描述
htonl 转换IP

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

int main(){

    //htons
    unsigned short a=0x0102;
    unsigned short b=htons(a);
    printf("a:%x\n",a);
    printf("b:%x\n",b);

    //htonl 转换IP
    char buf[4]={192,168,1,100};
    int num=*(int *)buf;
    int sum=htonl(num);

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


    return 0;
}

在这里插入图片描述
变成了网络字节序

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

int main(){

    //htons
    unsigned short a=0x0102;
    unsigned short b=htons(a);
    printf("a:%x\n",a);
    printf("b:%x\n",b);

    //htonl 转换IP
    char buf[4]={192,168,1,100};
    int num=*(int *)buf;
    int sum=htonl(num);

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

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

在这里插入图片描述

socket地址

socket是一个结构体,用于封装端口号和IP等信息

IP地址转换

将点分十进制的字符串,转换为一个整数

在这里插入图片描述
将网络字节序的IP整数转换成点分十进制的IP字符串
在这里插入图片描述

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

int main(){

    //创建一个ip字符串
    char buf[]="192.168.1.4";
    unsigned int num=0;
    //将巅峰十进制的IP字符串转换成网络字节序的整数
    inet_pton(AF_INET,buf,&num);
    unsigned char * p=(unsigned char *)&num;
    printf("%d %d %d %d\n",*p,*(p+1),*(p+2),*(p+3));

    //将网络字节序的IP整数转换成点分十进制的IP字符串
    char ip[16]="";
    const char * str =inet_ntop(AF_INET,&num,ip,16);
    printf("%s\n",str);
    


    return 0;
}

TCP通信流程

UDP适合用于实时应用(视频会议、直播),TCP适合可靠性高的应用(文件传输)。UDP在数据传输过程中不可靠,可能会丢失

套接字函数


原文地址:https://blog.csdn.net/qq_43920838/article/details/143558403

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!