网络通信

三大(通信)网络:计算机网络(有线网络,WIFI)、电信网络(有线电话,2G/3G/4G/5G)、有线电视网络
网络融合:电信网络提供基础设施(基站、线路),计算机网路借用信道传播数据
计算机网络(主流):开放、廉价

实质:进程之间的通信,只需要准备好物品,写好地址(IP+端口号),其他的丢给网络就好。
IP地址:(茫茫计算机网络中)用来唯一地标识某个网络中的一台设备。
端口号(port):用来唯一标识同一台设备中的不同进程。就是一个非负整数,范围:0-65535

网络通信的两种实现方式:(计算机网络中唯二的两家物流公司)
1、 基于TCP协议:面向连接,传输可靠,但传输效率低
2、 基于UCP协议:无连接,传输效率高,但不保证可靠,尽力传输。

基于TCP协议通信实现:参与通信的两个程序是不对等的,一个是客户端程序,一个是服务器端程序。即采用C/S模式。(client/server)客户端是主动发起通信,服务器端是被动。

套接字(socket):插座,一个网络接入点。相当于手机(网络开关)

服务器端程序实现步骤: 客户端
1.创建监听套接字(买一部只能接电话的手机) 1.创建流套接字(买手机)
2.给套接字绑定(IP)地址(相当于给手机上号) 2.绑定地址(买卡)
3.将套接字设置为监听状态(开机,将手机设置为待机) 3.连接服务器 (呼叫)
4.接受客户端连接请求(相当于接受来电请求) 4.收发数据(通话)
5.收发数据(相互通信) 5.断开连接(挂机)
6.断开连接(挂机)
456|456|456|456|456(可重复执行)
7.关闭监听套接字(手机关机或飞行模式)

相关函数:
 int socket(int domain, int type, int protocol);
//套接字描述符
第一个参数:AF_INET:使用internet地址家族,即采用TCP/IP网络标准(基本固定)
第二个参数:表套接字类型主要有三种形式
SOCK_STREAM : 流套接字,用于TCP协议通信
SOCK_DGRAM: 即数据报套接字,用于UDP协议通信
SOCK_RAW :即原始套接字,用于网络底层通信
第三个参数:表示使用的通信协议,0表示使用默认协议
 uint16_t htons(uint16_t hostshort)将一个short类型数据从主机字节序转化为网络字节序
host(主机) to networks(网络) s(short)
 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
将套接字和端口号绑定
 int listen(int sockfd, int backlog)
//等待队列长度,通常设置为5
 int accept (int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//新的套接字|连接套接字//对方的地址信息,不关注时设置为NULL,关注时用结构体保存
新的套接字专门用于收发数据
 ssize_t send(int sockfd, const void *buf, size_t len, int flags)
//内存地址 //大小 //标识

服务器端代码

#include <sys/types.h>          
#include <sys/socket.h>
#include <stdio.h> 
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
int main()
{ 
//1、买手机//创建套接字      //address intnet(固定)
    int socket_listen=socket(AF_INET,SOCK_STREAM,0);
    //套接字描述符号       //地址家族//套接字类型//默认协议

//2、登记各种信息(结构体)//绑定地址
    struct sockaddr_in myaddr;
    myaddr.sin_family = AF_INET;//指定地址家族为Internet地址家族
    myaddr.sin_addr.s_addr=INADDR_ANY;//指定IP地址为本机任意地址
    myaddr.sin_port=htons(6666);//指定端口号为6666
    //htons:将一个short数据从主机字节序转化为网络字节序
//绑卡
    if(-1==bind(socket_listen,(struct sockaddr*)&myaddr,sizeof(myaddr)))
    {                          //历史遗留,统一结构体标准
        perror("bind");
        exit(-1);
    }
//3、手机待机//将套接字设置为监听状态
    listen(socket_listen,5);//等待队列长度,通常设为5

//4、接电话//接受客户端连接请求
    int sock_conn=accept(socket_listen,NULL,NULL);
    //返回值是一个连接套接字,专门用于对应的连接上和客户端进行通信
//5、收发数据
    //send 发送,将内存的数据发到网络
    //receive 接收,将网络上接受的数据存到内存

    char msg[100];
    int ret;
    strcpy(msg,"hello");
    ret=send(sock_conn,msg,strlen(msg),0);//0表默认,不加额外控制//发

    ret=recv(sock_conn,msg,sizeof(msg)-1,0);//收
                        //减'\0'
//  if(ret<0)//异常断开
//  if(ret=0)//对方正常断开
    if(ret>0)
    {
        msg[ret]='\0';//把收到的加'\0'
        printf("客户端说:%s\n",msg);
    }
    else
    {
        printf("接收失败,连接断开\n");
    }
//6、断开连接,即关闭连接套接字
    close(sock_conn);

//7、关闭监听套接字
    close(socket_listen);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章