IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux - 网络编程(一) - TCP -> 正文阅读

[系统运维]Linux - 网络编程(一) - TCP

======================

No.1 网络编程基础

1.1 网络

多个主机连到一起,就形成了网络。
在这里插入图片描述

1.2 主机

并非必须得是一台计算机,共享单车、共享充电宝、路由器、空调、智能开关等都是主机,只要具备网络功能的计算机都是主机。具有网络模块的芯片也算是一个主机。

1.3 C/S B/S

  • 服务器:提供指定服务的机器(功能单一)
  • 客户端:界面 用来和用户交互
  • C/S: Clinet/Server 客户端/服务器 (单一)
  • B/S: Browser/Server 浏览器/服务器 (繁杂)

1.4 网络分层

  • 应用:
    ftp http https smtp ppppoe这种协议
  • 传输:
    数据的具体传输方式 Tcp(中心化)/Udp(去中心化)
  • 网络:
    ip 往哪里发
  • 数据链路:加密 翻译 编解码
    字节
  • 物理:硬件(网卡)
    硬件层次传电信号或者光信号(光纤,光缆,双绞线)

1.4 协议

约定的规则

  • 公有协议:全世界通用的标准 tcp udp http 公历纪元
  • 私有协议:某些公司或者个人制定的标准

1.5 ip

  • IP地址 协议 ipv4 ipv6
    区分网络中的主机,本质就是一个整数

1.6 端口

  • 一台主机为了区分不同应用(不同进程)所以有多个网络端口,同一时刻,有且只能一个进程使用某个端口进行通信。

No.2 TCP

	tcp协议编程模型
	Server							Client
	1. 创建socket					1. 创建socket
		socket 返回一个描述符号(类似文件描述符号)
	2. 确定服务器协议地址簇			2. 获取服务器协议地址簇
		struct sockaddr
	3. 绑定
		bind
	4. 监听
		listen
	5. 接收客户端连接					3. 连接服务器
		accept							connect
	6. 通信							4. 通信
		recv	send
	7. 断开连接						5. 断开连接
		close
  • 建立稳定全双工稳定数据传输通道:
    • 打电话 直播 一直不间断的
    • 发短信 断断续续的
    • 全双工:双向同时进行
#include <sys/types.h>
#include <sys/socket.h>
/*返回一个网络描述符好,类似文件描述符号,一半被翻译为套接字,
时网络设备的映射,操作套接字就是在操作对应的网络设备*/
int socket(
	int domain,		//协议类型	AF_LOCAL AF_INET
	int type,		//媒介类型 	SOCK_STREAM
	int protocol);	//保护类型	0默认

Client

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<signal.h>
int clinentSocket;
int serverFd;
void handler(int num)
{
    if(num==2)
    {
        close(serverFd);
        close(clinentSocket);
        printf("关闭客户端!\n");
        exit(0);
    }
}

int main(int argc,char* argv[])
{
    signal(2,handler);
    if(argc!=3) printf("cmd err!\n"),exit(0);
    //创建
    serverFd = socket(AF_INET,SOCK_STREAM,0);
    if(-1==serverFd) printf("创建socket失败:%m\n"),exit(-1);
    printf("创建socket成功!%m\n");

    //协议地址簇
    struct sockaddr_in addr = {0};
    addr.sin_family = AF_INET;  //与socket的第一个参数一致
    addr.sin_addr.s_addr = inet_addr(argv[1]);//字符串转为整形 需要注意大小端的问题
    addr.sin_port = htons(atoi(argv[2]));//端口号
    
    //连接服务器
    int r = connect(serverFd,(struct sockaddr*)&addr,sizeof addr);
    if(-1==clinentSocket) printf("连接服务器失败:%m\n"),close(serverFd),exit(-1);
    printf("连接服务器成功!%m\n");


    //通信
    char buff[256];
    while(1)
    {
        memset(buff,0,256);
        r = 0;
        printf("请输入>>");
        scanf("%s",buff);
        r = send(serverFd,buff,strlen(buff),0);
        if(r<0)
        {
            printf("发送失败!\n");
        }
    }
    return 0;
}

Server

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<signal.h>
int clinentSocket;
int serverFd;
void handler(int num)
{
    if(num==2)
    {
        close(serverFd);
        close(clinentSocket);
        printf("关闭服务器!\n");
        exit(0);
    }
}

int main(int argc,char* argv[])
{
    signal(2,handler);
    if(argc!=3) printf("cmd err!\n"),exit(0);
    //创建
    serverFd = socket(AF_INET,SOCK_STREAM,0);
    if(-1==serverFd) printf("创建socket失败:%m\n"),exit(-1);
    printf("创建socket成功!%m\n");

    //协议地址簇
    struct sockaddr_in addr = {0};
    addr.sin_family = AF_INET;  //与socket的第一个参数一致
    addr.sin_addr.s_addr = inet_addr(argv[1]);//字符串转为整形 需要注意大小端的问题
    addr.sin_port = htons(atoi(argv[2]));//端口号
    
    //绑定(很容易失败)
    int r = bind(serverFd,(struct sockaddr*)&addr,sizeof addr);
    if(-1==r) printf("绑定失败:%m\n"),close(serverFd),exit(-1);
    printf("绑定成功!%m\n");

    //监听
    r = listen(serverFd,10);
    if(-1==r) printf("监听失败:%m\n"),close(serverFd),exit(-1);
    printf("监听成功!%m\n");

    //接受客户端连接
    clinentSocket = accept(serverFd,NULL,NULL);
    if(-1==clinentSocket) printf("接受客户端连接失败:%m\n"),close(serverFd),exit(-1);
    printf("接受客户端连接成功!%m\n");

    //通信
    char buff[256];
    while(1)
    {
        r = recv(clinentSocket,buff,255,0);
        if(r>0)
        {
            buff[r] = 0;
            printf("<< %s\n",buff);
        }
    }
    return 0;
}

No.3 UDP

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:30:38  更:2022-09-24 21:34:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:36:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码