当前位置:首页 » 编程语言 » kcp通信实现c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

kcp通信实现c语言

发布时间: 2022-10-17 18:42:20

1. 网络风险处理流程》有几个KCP点+)A.1+)B.2+)C.+3+)D,+4

咨询记录 · 回答于2021-12-11

2. 关于C语言编程

全是错误 连最基本的语法都不会
#include<stdio.h>
void xspjf(int *a[10])//a[]没有类型 一下全是
{
int i;
for(i=0;i<10;i++)//这里要用分号不是‘,’隔开
{
printf("%d",(float)(a[i][0]+a[i][1]+a[i][2]+a[i][3]+a[i][4])/5);
printf(" ");
}
}
void kcpjf(int *a[10])
{
int i;
for(i=0;i<5;i++)
{
printf("%d",(a[0][i]+a[1][i]+a[2][i]+a[3][i]+a[4][i]+a[5][i]+a[6][i]+a[7][i]+a[8][i]+a[9][i])/10);//这里是;不是逗号
printf(" ");
}
}
void zgf(int *a[5])
{
int i,j,t;
t=a[0][0];
for(i=0;i<10;i++)
for(j=0;j<5;j++)
{
if(a[i][j]>t)
{
t=a[i][j];
}
}
printf("%d,%d",i+1,j+1);
}
int ysrs(int *a[10])
{
int n,k=0;
for(n=0;n<10;n++)
{
if(a[n][0]>90&&a[n][1]>90&&a[n][2]>90&&a[n][3]>90&&a[n][4]>90)
k=k+1;//你这里是要做什么啊?我给你换了下k=k+1
}
return k;
}
void main()
{
int i,j;
int a[10][5];
printf("请按顺序输入各学生的各科分数");
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&a[i][j]);
}
prinrf("\n");}
xspjf(a);
kcpjf(a);
printf("每个学生的平均分为:\n");
xspjf(a);
printf("\n");
printf("每个课程的平均分为:\n");//这儿不能有逗号 因为你后面没有参数 下面也是
kcpjf(a);
printf("\n");
printf("成绩单:");
for(i=0;i<10;i++)
{for(j=0;j<5;j++)
printf("%d",a[i][j]);
prinrf("\n");}
printf("最高分的学生的学号:%d课程为:%d");
zgf(a);
printf("5门科目分数都高于90分的人数为%d",ysrs(a));
}

3. Ngrok有时很不稳定,有什么更好的内网穿透方法

以下内容来自公众号逆锋起笔,关注每日干货及时送达

原文:v0w.top/2020/08/11/IntranetProxy

前言

本文以渗透的视角,总结几种个人常用的内网穿透,内网代理工具,介绍其简单原理和使用方法。

1、nps-npc1.1 简介

nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。

  • 一台有公网IP的服务器(VPS)运行服务端(NPS)

  • 一个或多个运行在内网的服务器或者PC运行客户端(NPC)



  • 1.2 特点
  • Go语言编写

  • 支持跨平台

  • 支持多种协议的代理

  • web管理端


  • 1.3 使用方法
  • https://github.com/ehang-io/nps/releases


    NPS
    安装配置

    找到自己服务器相应版本的server:

    cd ~
    wget https://github.com/cnlh/nps/releases/download/v0.23.2/linux_amd64_server.tar.gz
    tar xzvf linux_amd64_server.tar.gz
    cd ~/nps

    在nps目录下面会有一个nps可执行文件、conf配置目录和web网页目录,我们只需要修改conf/nps.conf即可:

    vim conf/nps.conf

    需要改一下#web下面的几个参数,

    web_host= 服务器IP或者域名
    web_username= admin(登录用户名)
    web_password= 你的密码
    web_port=8080(web管理端口)

    修改#bridge可以更改 NPC的连接端口。比如我们拿到一台权限受限的服务器,有防火墙,可能只有部分端口(80,443)可以出网,就需要修改成出网端口。

    ##bridge
    bridge_type=tcp
    bridge_port=443 # 修改连接端口
    bridge_ip=0.0.0.0


    启动

    #Mac/Linux
    ./nps test|start|stop|restart|status 测试配置文件|启动|停止|重启|状态

    #Windows
    nps.exe test|start|stop|restart|status 测试配置文件|启动|停止|重启|状态

    NPC

    ./npc -server=你的IP:8024 -vkey=唯一验证密码 -type=tcp

    新建好客户端后,也可以在+中看到,详细的客户端连接命令:

    在客户端界面可以通过新增的方式添加客户端连接,每一个连接的vkey都是唯一区分的。

    每一个客户端,在建立连接后,都可以建立多个不同协议的隧道,这一个个隧道就是不同的代理了。

    通过不同的协议和端口就可以连接代理的内网机器。

    2、frp
    2.1 简介

  • frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。


  • 2.2 特点
  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。

  • 端口复用,多个服务通过同一个服务端端口暴露。

  • 跨平台,但是支持的比nps少一点

  • 多种插件,提供很多功能

  • 2.3 使用方法
  • 下载: https://github.com/fatedier/frp/releases

  • 以下内容摘自:https://segmentfault.com/a/11900000218768361. 通过 rdp 访问家里的机器
  • 1.修改 frps.ini 文件,为了安全起见,这里最好配置一下身份验证,服务端和客户端的 common 配置中的token参数一致则身份验证通过:

    # frps.ini
    [common]
    bind_port = 7000
    # 用于身份验证,请自行修改,要保证服务端与客户端一致
    token = abcdefgh

    2.启动 frps:

    ./frps -c ./frps.ini

    3.修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:

    # frpc.ini
    [common]
    server_addr = x.x.x.x
    server_port = 7000
    # 用于身份验证,请自行修改,要保证服务端与客户端一致
    token = abcdefgh

    [rdp]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 3389
    remote_port = 6000

    4.启动 frpc:

    ./frpc -c ./frpc.ini

    5.通过 rdp 访问远程的机器,地址为:

    x.x.x.x:6000

    开机自启

    针对 Windows 系统,为了便于使用,可以配置一下开机的时候静默启动。

    1.在 frpc.exe 的同级目录创建一个 start_frpc.vbs:

    'start_frpc.vbs
    '请根据实际情况修改路径
    CreateObject("WScript.Shell").Run """D:Program Filesfrp_windows_amd64frpc.exe""" & "-c" & """D:Program Filesfrp_windows_amd64frpc.ini""",0

    2.复制 start_frpc.vbs 文件,打开以下目录,注意将

    改为你的用户名:

    C:Users\ MenuProgramsStartup

    3.鼠标右击,粘贴为快捷方式即可。

    2. 通过 SSH 访问公司内网机器

    frps 的部署步骤同上。

    1.启动 frpc,配置如下:

    # frpc.ini
    [common]
    server_addr = x.x.x.x
    server_port = 7000
    # 用于身份验证,请自行修改,要保证服务端与客户端一致
    token = abcdefgh

    [ssh]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6000

    2.通过 SSH 访问内网机器,假设用户名为 test:

    ssh -oPort=6000 [email protected]

    3. 通过自定义域名访问部署于内网的 Web 服务

    1.修改 frps.ini 文件,设置 http 访问端口为 8080:

    # frps.ini
    [common]
    bind_port = 7000
    vhost_http_port = 8080
    # 用于身份验证,请自行修改,要保证服务端与客户端一致
    token = abcdefgh

    2.启动 frps:

    ./frps -c ./frps.ini

    3.修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 Web 服务对应的端口, 绑定自定义域名www.yourdomain.com:

    # frpc.ini
    [common]
    server_addr = x.x.x.x
    server_port = 7000
    # 用于身份验证,请自行修改,要保证服务端与客户端一致
    token = abcdefgh

    [web]
    type = http
    local_port = 80
    custom_domains = www.yourdomain.com

    4.启动 frpc:

    ./frpc -c ./frpc.ini

    5 .将www.yourdomain.com的域名 A 记录解析到 IPx.x.x.x,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。

    6.通过浏览器访问http://www.yourdomain.com:8080即可访问到处于内网机器上的 Web 服务。

    4. 对外提供简单的文件访问服务

    通过static_file插件可以对外提供一个简单的基于 HTTP 的文件访问服务。

    frps 的部署步骤同上。

    1.启动 frpc,启用static_file插件,配置如下:

    # frpc.ini
    [common]
    server_addr = x.x.x.x
    server_port = 7000
    # 用于身份验证,请自行修改,要保证服务端与客户端一致
    token = abcdefgh

    [test_static_file]
    type = tcp
    remote_port = 6000
    plugin = static_file
    # 要对外暴露的文件目录
    plugin_local_path = /tmp/file
    # 访问 url 中会被去除的前缀,保留的内容即为要访问的文件路径
    plugin_strip_prefix = static
    plugin_http_user = abc
    plugin_http_passwd = abc

    2.通过浏览器访问http://x.x.x.x:6000/static/来查看位于/tmp/file目录下的文件,会要求输入已设置好的用户名和密码。

    常用功能

    统计面板(Dashboard)

    通过浏览器查看 frp 的状态以及代理统计信息展示。

    注:Dashboard 尚未针对大量的 proxy 数据展示做优化,如果出现 Dashboard 访问较慢的情况,请不要启用此功能。

    需要在 frps.ini 中指定 dashboard 服务使用的端口,即可开启此功能:

    [common]
    dashboard_port = 7500
    # dashboard 用户名密码,默认都为 admin
    dashboard_user = admin
    dashboard_pwd = admin

    打开浏览器通过http://[server_addr]:7500访问 dashboard 界面,用户名密码默认为admin。

    加密与压缩

    这两个功能默认是不开启的,需要在 frpc.ini 中通过配置来为指定的代理启用加密与压缩的功能,压缩算法使用 snappy:

    # frpc.ini
    [ssh]
    type = tcp
    local_port = 22
    remote_port = 6000
    use_encryption = true
    use_compression = true

    如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 SSH 协议等,通过设置use_encryption = true,将 frpc 与 frps 之间的通信内容加密传输,将会有效防止流量被拦截。

    如果传输的报文长度较长,通过设置use_compression = true对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 CPU 资源。

    [TLS

    从 v0.25.0 版本开始 frpc 和 frps 之间支持通过 TLS 协议加密传输。通过在frpc.ini的common中配置tls_enable = true来启用此功能,安全性更高。

    为了端口复用,frp 建立 TLS 连接的第一个字节为 0x17。

    注意:启用此功能后除 xtcp 外,不需要再设置 use_encryption。

    代理限速

    目前支持在客户端的代理配置中设置代理级别的限速,限制单个 proxy 可以占用的带宽。

    # frpc.ini
    [ssh]
    type = tcp
    local_port = 22
    remote_port = 6000
    bandwidth_limit = 1MB

    在代理配置中增加bandwidth_limit字段启用此功能,目前仅支持MB和KB单位。

    范围端口映射

    在 frpc 的配置文件中可以指定映射多个端口,目前只支持 tcp 和 udp 的类型。

    这一功能通过range:段落标记来实现,客户端会解析这个标记中的配置,将其拆分成多个 proxy,每一个 proxy 以数字为后缀命名。

    例如要映射本地 6000-6005, 6007 这 6 个端口,主要配置如下:

    # frpc.ini
    [range:test_tcp]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 6000-6006,6007
    remote_port = 6000-6006,6007

    实际连接成功后会创建 8 个 proxy,命名为test_tcp_0, test_tcp_1 ... test_tcp_7。

    3、ew3.1 简介

  • EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。但是,现在工具已经不更新了。。。


  • 3.2 特点
  • 轻量级,C语言编写

  • 可以设置多级代理

  • 跨平台

  • 但是只支持Socks5代理

  • 3.3 使用方法以下使用方法均摘自:http://rootkiter.com/EarthWorm/
  • 以下所有样例,如无特殊说明代理端口均为1080,服务均为SOCKSv5代理服务.

    该工具共有 6 种命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。

    1. 正向 SOCKS v5 服务器

    $ ./ew -s ssocksd -l 1080

    2. 反弹 SOCKS v5 服务器

    这个操作具体分两步:

    a) 先在一台具有公网 ip 的主机A上运行以下命令:

    $ ./ew -s rcsocks -l 1080 -e 8888

    b) 在目标主机B上启动 SOCKS v5 服务 并反弹到公网主机的 8888端口

    $ ./ew -s rssocks -d 1.1.1.1 -e 8888

    成功。

    3. 多级级联

    工具中自带的三条端口转发指令, 它们的参数格式分别为:

    $ ./ew -s lcx_listen -l 1080 -e 8888
    $ ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999
    $ ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999

    通过这些端口转发指令可以将处于网络深层的基于TCP的服务转发至根前,比如 SOCKS v5。首先提供两个“二级级联”本地SOCKS测试样例:

    a)lcx_tran的用法

    $ ./ew -s ssocksd -l 9999
    $ ./ew -s lcx_tran -l 1080 -f 127.0.0.1 -g 9999

    b)lcx_listen、lcx_slave的用法

    $ ./ew -s lcx_listen -l 1080 -e 8888
    $ ./ew -s ssocksd -l 9999
    $ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999

    再提供一个“三级级联”的本地SOCKS测试用例以供参考

    $ ./ew -s rcsocks -l 1080 -e 8888
    $ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999
    $ ./ew -s lcx_listen -l 9999 -e 7777
    $ ./ew -s rssocks -d 127.0.0.1 -e 7777

    数据流向:SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks

    4、ngrok4.1 简介

  • 4.2 特点
  • 官方维护,一般较为稳定

  • 跨平台,闭源

  • 有流量记录和重发功能

  • 4.3 使用方法
  • 进入ngrok官网(https://ngrok.com/),注册ngrok账号并下载ngrok;

  • 根据官网给定的授权码,运行如下授权命令;

  • ./ngrok authtoken 1hAotxhmORtzCYvUc3BsxDBPh1H_******************

  • ./ngrok http 80即可将机器的80端口http服务暴露到公网,并且会提供一个公网域名。



  • 可以通过官网的UI界面查看数据包和流量等等(但是要付费==、)

    还可以通过一些命令将内网的文件和其他TCP服务 暴露到公网中。

    有授权的设置文件共享

    ngrok http -auth="user:password" file:///Users/alan/share

    无授权的设置文件共享

    ngrok http "file:///C:\Users\alan\Public Folder"

    将主机的3389的TCP端口暴露到公网

    ngrok tcp 3389

    更多使用方法参考:https://ngrok.com/docs

  • 内网渗透之内网穿透

  • 开源内网穿透工具 frp 简单使用教程

  • http://rootkiter.com/EarthWorm/

4. C语言统计文本字母出现次数按从大到小顺序排,急用高分

#include <stdio.h>
#include <string.h>

void countc(int count[])
{
int index = 0;
char ch;

for (i = 0; i < 25; i++)
{
count[i] = 0;
}

FILE *fp = fopen("D:\\Data.txt", "r");
while((ch = fgetc(fp))!=EOF)
{
index = ch - 65;
if(index >= 0 && index < 26 ) count[index]++;
else
{
index = ch - 32;
if(index >= 0 && index < 26 ) count0[index]++;
}
}
}

void Swap(int &a,int &b)
{
a=a^b;
b=a^b;
a=a^b;
}

void main()
{
int cnt [26] = {0};
FILE *fp = fopen("D:\\Result.txt", "w");
countc(cnt);
char ch[26];
for(int i=0;i<26;i++)
{
ch[i]=i+65;//把字母赋值进数组
}

for (int i = 0; i < 26; i++)
{
for(int j=25;j>i;J--)
{
if(cnt[j]<cnt[j-1]])
{
Swap(cnt[j],cnt[j-1]);
ch[j]=ch[j]^ch[j-1];
ch[j-1]=ch[j]^ch[j-1];
ch[j]=ch[j]^ch[j-1];
}
}
}
for(int i=0;i<26;i++)
{
cout<<ch[i]<<"字母个数为"<<cnt[i]<<endl;
}

getchar();
}

5. C语言编程

#include <io.h>
#include <stdlib.h>
#include <stdio.h>

/*定义学生成绩结构体*/
struct stuscore
{
char szID[80];/*学号*/
char szName[80];/*姓名*/
int iEn;/*英语*/
int iCp;/*C程序*/
int iMt;/*数学*/
};

/*输入成绩并保存文件*/
void InputScore(void)
{
stuscore astu;
FILE *pf;

printf("输入学号 = ");
scanf("%s",astu.szID);
printf("输入名字 = ");
scanf("%s",astu.szName);
printf("输入英语 = ");
scanf("%d",&astu.iEn);
printf("输入C程序 = ");
scanf("%d",&astu.iCp);
printf("输入数学 = ");
scanf("%d",&astu.iMt);

/*如果文件不存在则创建*/
if ( _access("stu.txt",0) == -1 )
{
pf = fopen("stu.txt","wt");
}
else
{
pf = fopen("stu.txt","a+");
}
fprintf(pf,"%s %s %d %d %d\n",astu.szID,astu.szName,astu.iEn,astu.iCp,astu.iMt);
fclose(pf);
}

/*计算平均分保存文件*/
void JsPjf(void)
{
stuscore astu;
FILE *pf_read = fopen("stu.txt","rt");
FILE *pf_write = fopen("pjf.txt","wt");

while( ! feof(pf_read) )
{
fscanf(pf_read,"%s %s %d %d %d\n",astu.szID,astu.szName,&astu.iEn,&astu.iCp,&astu.iMt);
fprintf(pf_write,"%s %s %d",astu.szID,astu.szName,(astu.iEn+astu.iCp+astu.iMt)/3);
}

fclose(pf_read);
fclose(pf_write);
}

/*统计每门课程平均分并写文件*/
void TjKcPjf(void)
{
stuscore astu;
int iTotalEn = 0,iTotalCp = 0,iTotalMt = 0;
FILE *pf_read = fopen("stu.txt","rt");
FILE *pf_write = NULL;
int iNumber = 0;

while( ! feof(pf_read) )
{
fscanf(pf_read,"%s %s %d %d %d\n",astu.szID,astu.szName,&astu.iEn,&astu.iCp,&astu.iMt);
iTotalEn += astu.iEn;
iTotalCp += astu.iCp;
iTotalMt += astu.iMt;
iNumber++;
}
fclose(pf_read);
pf_write = fopen("kcpj.txt","wt");
fprintf(pf_write,"英语平均分:%d\n",iTotalEn/iNumber);
fprintf(pf_write,"C语言平均分:%d\n",iTotalCp/iNumber);
fprintf(pf_write,"数学平均分:%d\n",iTotalMt/iNumber);
fclose(pf_write);
}

/*菜单*/
void ShowMenu(void)
{
char c = 0;

while( true )
{
system("cls");
printf("请选择:\n");
printf("1 输入学生成绩.\n");
printf("2 计算学生平均成绩.\n");
printf("3 计算课程平均成绩.\n");
printf("0 退出.\n");
printf("\n输入 = ");

fflush(stdin);
c=getchar();
fflush(stdin);
if ( c < '0' || c > '9' )
{
continue;
}
switch( c )
{
case('0'):
{
exit(0);
break;
}
case('1'):
{
InputScore();
break;
}
case('2'):
{
JsPjf();
break;
}
case('3'):
{
TjKcPjf();
break;
}
default:
{
continue;
}
}
}
}

/*剩下的功能参照上面的格式自己做一下就OK了*/

int main(void)
{
ShowMenu();
return 0;
}

6. kuka iiwa如何两点移动

下面分享几个库卡KUKA机器人在使用过程中可能出现的一些小问题及解决办法。

KUKA机器人常见问题及解决方案

1 .开机坐标系无效

世界坐标系是以枪头为基点,在这种坐标系中机器人所有的动作都是按照以枪头为顶点来完成移动,XYZ方向切割枪方向不改变,如果机器人在世界坐标系中移动,枪头也随着改变方向,那就是我们在开机后没有选择工具。

解决方案:配置→当前工具/基坐标→工具号→1

2. 专家登陆

一般情况,开机后我们要编辑程序时,首先我们要登陆专家级别,有助于我们操作。

解救方案:配置→用户组→专家→登陆→密码KUKA→登陆

3. 设置END

新建程序我们发现没有终点,我们要设置终点。

解决方案:配置→杂项→编辑器→定一行DEF

4. 程序第一条设置为home位置

编辑程序时,第一条指令要设为home位置,这时我们在最后可以直接找到home位置的标准,可以节省手动移动机器人的操作时间。

5 .手动关闭输出信号

当我们在测试程序或者正常使用时(已经打开了输出信号),有时候会遇到突发情况,比如说程序路径有撞车危险,或者预热失败,程序错误等等,这时候我们要手动关闭输出信号。在问题解决完毕后我们可以再次用kcp打开输出信号。(其中我们的输出信号是3是低压氧,4是高压氧,5是丙烷)

解决方案:显示→输入/输出端→数字输出端→按住驱动→数(关闭或者打开)

6. 6D鼠标失效

系统指示6D鼠标仍然有电压之类的提示,鼠标失效了,我们这时可以松开驱动,从新按下去等待驱动指示 I 变为绿色即可。

7 .从电脑中拷贝程序

电脑中拷贝程序,以便C盘中程序丢失后,我们可以从D盘或者外部移动U盘中拷贝使用。

解决方案:专家登陆后→按Num(此时显示器上Num为灰色,在按一下转换回来)→CTRL(2)+Esc→电脑C盘→KRC→ROBOTER→KRC→R1→Program

8. 机器人保护

当机器人撞车后,会启动自动保护,也就是机器人在A6轴处有一个保护系统,当撞车后弹簧被压弯变形,系统接收到信号后会停止一切操作,此时我们无法操作机器人,这时候我们要先关掉保护开关。

解决方案:配置→输入/输出端→外部自动→允许运动→把5改成1025→此时机器人就不受系统保护限制可以移动,注意调节机器人运动方向,调整运动速度,离开撞车点,到达安全位置后把“允许运动”的数值调成5 即可。

9. 下列情况下KUKA机器人需要重新标定零点

机器人没有完全关闭下,蓄电池电量消耗殆尽后会丢失零点。

机器人撞到硬限位了时,会丢失零点。

手动删除零点。

开机失效,直接就关机会丢失零点。

10. 程序数据参数

切割速度 直线和圆弧都是0.005m/s ,加速度1%

机器人移动速度PTP是20% 或者10%

7. Unity网络编程(一)常见概念

一直用Http用多了 复习一下基础
Unity通讯一般分为2类
Http : 应用层 Unity内置的UnityWebRequest类进行通信(之前写过一个分发器垃圾框架)用于交互量比较小
Socket:传输层 比较底层 实现TCP/UDP 用于频繁的通信

这个是基于TCP 和IP传输不同消息

这个是三种常见的网络层次划分

基本数据单位为帧
主要的协议:以太网协议

基本数据单位为IP数据报;
IP协议(Internet Protocol,因特网互联协议)
ICMP协议(Internet Control Message Protocol,因特网控制报文协议)
ARP协议(Address Resolution Protocol,地址解析协议)
RARP协议(Reverse Address Resolution Protocol,逆地址解析协议)

包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP协议(User Datagram Protocol,用户数据报协议)

数据传输基本单位为报文
包含的主要协议:
FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)。

分配给用户上网使用的网际协议
目前IPv4多 比如192.168.1.1
新的IPv6(因为IPv4数量不够分配)如3ffe:3201:1401:1280:c8ff:fe4d:db39:1984。

Internet最基本的协议
TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。
可靠的协议 通过三次握手建立的面向连接通信协议

3次握手 四次挥手 实习生常考
TCP连接建立过程(三次握手):
1.首先Client端发送连接请求报文
2.Server段接受连接后回复ACK报文,并为这次连接分配资源。
3.Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。
TCP连接断开过程(四次挥手):
1.Client端发起中断连接请求(FIN报文)
2.Server端接到FIN报文后,发送ACK服务器还有消息没发完让Client待命,Client端就进入FIN_WAIT,继续等待Server端的FIN报文
3.Server端确定数据已发送完成,则向Client端发送FIN报文,
4.Client端收到FIN报文后发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传,Server端收到ACK后 关闭,Client等待了2MSL后依然没有收到回复客户端也关闭
SYN:"synchronize"请求同步标志;;ACK:"acknowledge"确认标志";FIN:"Finally"结束标志。

为什么要三次握手?
防止因为网卡导致Sever收到多次Client请求 建立N个监听 造成资源浪费
为什么要四次挥手?
自己不请求直接关闭 但是服务器还能给你发数据 服务器浪费资源 而且客户端也会强行接收
使用TCP的协议:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等。

面向无连接的通讯协议
UDP通讯时不需要接收方确认,属于不可靠的传输 会丢包
UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发
主要用于面向查询---应答的程序
每个UDP报文分UDP报头和UDP数据区两部分
UDP报头由4个域组成,其中每个域各占用2个字节
(1)源端口号;
(2)目标端口号;
(3)数据报长度;
(4)校验值。

使用UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议

HTTP协议特点:
简单快速 灵活 无连接 无状态 支持B/S(浏览器/服务器)及C/S(客户端/服务器)模式。
URL

和服务器有一些频繁的交互 用http时不时请求 叫轮询 效率低下
soket可以理解为插座 插头接上了可以保持通信

端口:
每个Socket连接都是从一台计算机网卡的一个端口连接到另外一台计算机网卡的某个端口。
IP是房子的话 端口就是门
TCP端口和UDP端口相互独立 如TCP255端口 和UDP255端口 不冲突

周知端口
范围从0到1023,其中80端口分配给WWW服务,21端口分配给FTP服务等。
浏览器的地址栏里输入一个网址的时候是不必指定端口号的,因为在默认情况下WWW服务的端口是“80”。
网络服务是可以使用其他端口号的 比如 网址:8080
但是有些系统协议使用固定的端口号,它是不能被改变的,比如139 端口专门用于NetBIOS与TCP/IP之间的通信,不能手动改变。
自己开发时尽量不要使用1024之下的端口,可能会与系统端口冲突。

服务端:
创建socket对象
bind:绑定IP地址和端口
listen:开始监听绑定的IP地址和端口,等待客户端的连接
accept:如果有客户端发起连接,通过accept接受连接请求,连接成功后会复制一个socket出来用于和当前接受连接的客户端进行通信。(服务端最初创建的那个socket只是用来监听并建立连接用的,实际和客户端通信并不是最初的socket,而是在accept这一步会自动创建一个新的socket出来和客户端通信。)
read/write:使用新的socket读写数据
close:关闭socket,如果关闭的是服务端的监听socket,则无法接收新的连接,但是已经创建的和客户端的连接不会被关闭。
客户端:
创建socket对象
connect:连接服务端,连接成功后系统会自动分配端口
read/write:连接成功后,就可以进行数据的读写了,这里读写使用的socket还是第一步创建的socket对象。
close:关闭连接。
如果收到了长度为0的数据,则代表远程socket关闭了连接。

服务器:
创建socket对象
bind:绑定IP和端口,用于接收数据(注意这里绑定完就可以直接接收数据了,并不需要等待连接)
read/write:读写数据
客户端:
创建socket对象
read/write:读写数据,不需要先建立连接,直接给对应的IP+端口发送数据即可。

由于没有建立连接以及连接的保障,UDP在传输效率上会很高
UDP有一个功能是TCP所不具备的,那就是广播功能(UDP可以将消息发送到在同一广播网络上的每个主机 CS、魔兽争霸局域网对战)。

HTTP/HTTPS(比http更安全):小游戏 网页 间歇性发送链接 偶尔延迟。
TCP长连接: 卡牌游戏 某些mmo 客户端和服务器都可以独立发包 偶尔延迟
UDP:动作游戏 mmo 枪战 客户端和服务器都可以独立发包 无法接受延迟

可以混合使用你的MMO客户端也许首先使用HTTP去获取上一次的更新内容,然后使用UDP跟游戏服务器进行连接。
现在也有kcp 就是tcp和udp结合 快速安全可靠

简单直接的长连接
可靠的信息传输
数据包的大小没有限制

坑多 断线检测、慢速客户端响应阻塞数据包,对开放连接的各种dos攻击,阻塞和非阻塞IO模型
丢包会有阻塞机制(一般是重发 tcp相反) 所以手机游戏ping跳1000就这个原因

只使用一个socket进行通信
快速
基于数据包构建
灵活 多种方式处理延迟

很多东西没有要自己构建
不可靠
丢包

客户端直接开始进行计算而不等待服务端确认是一种典型的隐藏延迟的技术(容易被抓包篡改)。
我们到底是使用TCP还是UDP取决于我们能否隐藏延迟。
比如TCP 在棋牌 卡牌游戏 卡1S无所谓 在动作游戏moba游戏就很致命
可靠的UDP/kcp和TCP不一样,要去实现一个特殊的阻塞控制,而且还要保证可靠性,也可以使用许多支持可靠通信的UDP库,但是库一般为了通用会降低某种新能,自己根据项目情况写可以发挥到极致
如果不知道用什么就TCP

8. KCP协议到底是个什么东西,和UDP有什么关系

kcp协议是传输层的一个具有可靠性的传输层ARQ协议。它的设计是为了解决在网络拥堵情况下tcp协议的网络速度慢的问题。kcp力求在保证可靠性的情况下提高传输速度。kcp协议的关注点主要在控制数据的可靠性和提高传输速度上面,因此kcp没有规定下层传输协议,一般用udp作为下层传输协议,kcp层协议的数据包在udp数据报文的基础上增加控制头。当用户数据很大,大于一个udp包能承担的范围时(大于mss),kcp会将用户数据分片存储在多个kcp包中。因此每个kcp包称为一个分片。

9. 任意输入n个整数,分别统计奇数的和,奇数的个数,偶数的和,偶数的个数.C语言

#include<stdio.h>;

intmain(intargc,char**argv){
inti,n,m,jh=0,oh=0,jg=0,og=0;
printf("请输入n值: ");
scanf("%d",&n);//先输入数据数n
printf("请输入%d数,按空格键隔开: ",n);
for(i=0;i<n;i++){
scanf("%d",&m);
if(m%2!=0){
jh=jh+m;
jg++;
}else{
oh=oh+m;
og++;
}
}//利用循环输入n数并计算
printf(" 奇数数:%d 奇数和:%d 偶数数:%d 偶数和:%d ",jg,jh,og,oh);//打印

return0;
}