精华内容
下载资源
问答
  • Linux的T / TCP主要集中在将事务TCP集成到Linux内核中。 TCP的所有新功能(包括实验功能)的所有实现也都非常有价值。
  • Modbus协议及数据转换的开源库。支持 RTU TCP 主站、从站通讯。包含 x86 和 arm-gnueabihf 下编译好的库文件。
  • 为windows和linux封装了具有相同接口的网络,windows下使用iocp(完成端口)实现,linux下使用epoll实现。同时还提供了定时器接口。你可以用它只作为网络模块的代码,也可以使用它作为你的程序框架。因为使用了C++...
  • linuxC版TCP客户端和服务端源码
  • Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...
  • Linux下常用的C/C++开源Socket

    万次阅读 2015-06-03 18:09:31
    Linux下常用的C/C++开源Socket

    1.      Linux Socket Programming In C++ : http://tldp.org/LDP/LG/issue74/tougher.html

    2.      ACE: http://www.cs.wustl.edu/~schmidt/ACE.html

    ACE采用ACE_OS适配层屏蔽各种不同的、复杂繁琐的操作系统API。

    ACE是一个大型的中间件产品,代码20万行左右,过于宏大,一堆的设计模式,架构了一层又一层。它庞大、复杂,适合大型项目。开源、免费,不依赖第三方库。使用的时候,要根据情况,看你从哪一层来进行使用。支持跨平台。

    ACE超重量级的网络通信开发框架。ACE自适配通信环境(AdaptiveCommunication Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++包装外观(Wrapper Facade)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等

    3.      C++ Sockets Library: http://www.alhem.net/Sockets/index.html

    它是一个跨平台的Sockets库,实现包括TCP、UDP、ICMP、SCTP协议。已实现的应用协议包括有SMTP、HTTP(S)、Ajp。具有SOCKS客户端实现以及匿名DNS,支持HTTP的GET/POST/PUT以及WebServer的框架。

    它封装了sockets C API的C++类库。支持SSL, IPv6, tcp和udp sockets, sctp sockets, http协议, 高度可定制的错误处理。

    4.      Asio C++ Library: http://think-async.com/

    它是一个基于Boost开发的异步IO库,封装了对Socket的常用操作,简化了基于Socket程序的开发。它开源、免费、支持跨平台。

    5.      libevent: http://libevent.org/

    它是一个C语言写的网络库,主要支持的是类Linux 操作系统,最新的版本添加了对Windows的IOCP的支持。由于IOCP是异步IO,与Linux下的POLL模型,EPOLL模型,还有freebsd的KQUEUE等这些同步模型在用法上完全不一致,所以使用方法也不一样,就好比ACE中的Reactor和Proactor模式一样,使用起来需要转变思路。如果对性能没有特别的要求,那么使用libevent中的select模型来实现跨平台的操作,select模型可以横跨Windows,Linux,Unix,Solaris等系统。

    Libevent是一个轻量级的开源高性能网络库,它的机制是采用事件触发,封装了以下三种事件的响应:IO事件,定时器事件,信号事件。select模型来实现跨平台的操作,Windows环境下支持IOCP。Google的开源WEB浏览器Chromium在Mac和Linux版本中,也使用了Libevent,足见该库的质量。

    6.      libev: http://software.schmorp.de/pkg/libev.html

    它是一个C语言写的,只支持Linux系统的库,以前的时候只封装了EPOLL模型.使用方法类似libevent,但是非常简洁,代码量是最少的一个库,也就几千行代码。显然这样的代码跨平台肯定是无法支持的了,如果你只需要在Linux下面运行,那用这个库也是可以的。

    libev和libevent很像,按照作者的介绍,可以作为libevent的替代者,能够提供更高的性能。libev是一个高性能事件循环,所实现的功能就是一个强大的reactor。

    7.      SimpleSocket: http://home.kpn.nl/lcbokkers/simsock.htm

    这个类库让编写基于Socket的客户/服务器程序更加容易。

    8.      simple-socket: http://sourceforge.net/projects/simple-socket/

    An easy to use C++ socket andnetwork library, mainly for UNIX systems.

    9.      POCO: http://pocoproject.org/

    POCO C++ Libraries提供一套C++的类库用以开发基于网络的可移植的应用程序,功能涉及线程、线程同步、文件系统访问、流操作、共享库和类加载、套接字以及网络协议包括:HTTP、FTP、SMTP等;其本身还包含一个HTTP服务器,提供XML的解析和SQL数据库的访问接口。POCO库的模块化、高效的设计及实现使得POCO特别适合嵌入式开发。在嵌入式开发领域,由于C++既适合底层(设备I/O、中断处理等)和高层面向对象开发,越来越流行。

    10.  libcurl: http://curl.haxx.se/libcurl/

    libcurl是免费的轻量级的客户端网络库,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS,POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet, TFTP.支持SSL, HTTPPOST,HTTPPUT, FTP上传, HTTP form上传,代理,cookies, 用户名与密码认证。

    如果你开发的是客户端,libcurl是一个不错的选择。

    11.  libiop: http://sourceforge.net/projects/libiop/

    一个c语言开发的跨平台网络IO库。

    功能特性:c/c++api, 底层支持epoll, select,poll等io模型;异步事件模型;任务池模型,跨平台线程接口;跨平台(Linux/windows);日志服务;稳定,支持7*24小时无间断运行,自动处理异常状态;高并发与快速响应;API简洁,学习成本底。

    注:以上内容整理自网络!

     

     

    展开全文
  • 【转】linuxtcp测试工具

    千次阅读 2019-07-09 08:58:53
    . 一、linux 网络调试助手 linux端一款不错的socket调试工具,叫“mNetAssist”也行,直接叫做“网络调试助手”也行。 感谢作者 ...感谢开源。 几个小特点。 1.UDP通讯; 2.可做 TCP客户...

     

    .

    一、linux 网络调试助手

    linux端一款不错的socket调试工具,叫“mNetAssist”也行,直接叫做“网络调试助手”也行。

    感谢作者

    感谢作者:enjoying-spring
    原帖地址:http://blog.chinaunix.net/uid-21977056-id-4310527.html

    感谢开源。

    几个小特点。

    • 1.UDP通讯;
    • 2.可做 TCP客户端;
    • 3.可做 TCP服务器;
    • 4.可以“十六进制”传送接收数据;
    • 5.可以传送和接收数据文件;
    • 6.TCP服务器模式时支持群聊模式;
    • 7.支持中文;

    软件界面

    .
    .

    使用初探

    我们用python写一个简单的udp代码测试一下。

    /Users/amqr/PycharmProjects/testPj/venv/bin/python /Users/amqr/PycharmProjects/testPj/udpSend.py
    ==============================
    1:发送消息
    2:接收消息
    ==============================
    请输入要操作的功能序号:1
    
    请输入要发送的数据:发送到linux
    
    请输入对方的ip地址:10.211.55.6
    
    请输入对方的port:6883
    ==============================
    1:发送消息
    2:接收消息
    ==============================
    请输入要操作的功能序号:1
    
    请输入要发送的数据:fine,good job.this is the second msg
    
    请输入对方的ip地址:10.211.55.6
    
    请输入对方的port:6883
    ==============================
    1:发送消息
    2:接收消息
    ==============================
    请输入要操作的功能序号:2
    >>>('10.211.55.6', 6883):from linux is ok?
    ==============================
    1:发送消息
    2:接收消息
    ==============================
    请输入要操作的功能序号:
    

    .
    .
    如下是接收完第二条消息之后,又发送回一条消息的界面

     

    image.png

     

    .
    .

    附上python代码

    import socket
    
    
    def send_msg(udp_socket):
        """获取键盘数据,并将其发送给对方"""
        # 1. 从键盘输入数据
        msg = input("\n请输入要发送的数据:")
        # 2. 输入对方的ip地址
        dest_ip = input("\n请输入对方的ip地址:")
        # 3. 输入对方的port
        dest_port = int(input("\n请输入对方的port:"))
        # 4. 发送数据
        udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))
    
    
    def recv_msg(udp_socket):
        """接收数据并显示"""
        # 1. 接收数据
        recv_msg = udp_socket.recvfrom(1024)
        # 2. 解码
        recv_ip = recv_msg[1]
        recv_msg = recv_msg[0].decode("utf-8")
        # 3. 显示接收到的数据
        print(">>>%s:%s" % (str(recv_ip), recv_msg))
    
    
    def main():
        # 1. 创建套接字
        udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # 2. 绑定本地信息
        udp_socket.bind(('', 6669))
        while True:
            # 3. 选择功能
            print("="*30)
            print("1:发送消息")
            print("2:接收消息")
            print("="*30)
            op_num = input("请输入要操作的功能序号:")
    
            # 4. 根据选择调用相应的函数
            if op_num == "1":
                send_msg(udp_socket)
            elif op_num == "2":
                recv_msg(udp_socket)
            else:
                print("输入有误,请重新输入...")
    
    if __name__ == "__main__":
        main()
    

    .
    .

    二、windows 网络调试工具

    这个比较常见。

     

    image.png

    image.png

    顺道附上下载链接:https://download.csdn.net/download/icoollike/10580427

    使用

    简单python客户端向服务器发送消息

    /Users/amqr/PycharmProjects/testPj/venv/bin/python /Users/amqr/PycharmProjects/testPj/04-tcp-客户端(client).py
    请输入要链接的服务器的ip:10.211.55.4
    请输入要链接的服务器的port:6666
    请输入要发送的数据:tcp test
    
    Process finished with exit code 0
    
    
    

    .
    .

    界面图

    界面.png

    .
    .

    python 代码

    import socket
    
    
    def main():
        # 1. 创建tcp的套接字
        tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
        # 2. 链接服务器
        # tcp_socket.connect(("192.168.33.11", 7890))
        server_ip = input("请输入要链接的服务器的ip:")
        server_port = int(input("请输入要链接的服务器的port:"))
        server_addr = (server_ip, server_port)
        tcp_socket.connect(server_addr)
    
        # 3. 发送数据/接收数据
        send_data = input("请输入要发送的数据:")
        tcp_socket.send(send_data.encode("utf-8"))
    
        # 4. 关闭套接字
        tcp_socket.close()
    
    
    if __name__ == "__main__":
        main()
    
    

    .
    .

    三、mac 网络调试工具 sokit

    mac下有一款PacketSender非常出名。

    不过我们现在要说的是国人开发的 [sokit]
    感谢作者 sakasa

    sokit 介绍链接:https://www.jianshu.com/p/d21006dcc4b7

    安装过程

    1、安装saka仓库
    brew tap rangaofei/saka

    2、安装软件
    brew install sokit
    因为要依赖qt,所以安装会稍微慢一点,安装成功后执行命令即可:

    3、启动
    sokit

    使用

    我们以为udp的发送和接收为例子。
    代码还是上面在linux的代码。

    控制台日志:

    /home/parallels/PycharmProjects/testPj/venv/bin/python /home/parallels/PycharmProjects/testPj/udptest.py
    ==============================
    1:发送消息
    2:接收消息
    ==============================
    请输入要操作的功能序号:1
    
    请输入要发送的数据:test to mac
    
    请输入对方的ip地址:192.168.0.103
    
    请输入对方的port:6772
    ==============================
    1:发送消息
    2:接收消息
    ==============================
    请输入要操作的功能序号:2
    >>>('192.168.0.103', 56230):back to linux
    ==============================
    1:发送消息
    2:接收消息
    ==============================
    请输入要操作的功能序号:
    

    .
    .

    sokit界面

    作为服务端接收消息

     

    image.png

    作为客户端发送消息

     

    image.png

    至此,三端介绍完毕。

    本文完。
    END.



    作者:阿敏其人
    链接:https://www.jianshu.com/p/cd024cea36aa
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • 差一点我们就擦肩而过了有趣有用有态度前言 tcp/ip协议栈相信在大家日常开发里面,或多或少都有接触过,在单片机领域比较常用的有以下几种开源的软件协议栈:LwIPuC/IPuIPTiny...

    差一点

    我们就擦肩而过了

    有趣

    有用

    有态度


    前言

    tcp/ip协议栈相信在大家日常开发里面,或多或少都有接触过,在单片机领域比较常用的有以下几种开源的软件协议栈:

    • LwIP

    • uC/IP

    • uIP

    • TinyTcp

    也有些产品直接使用硬件协议栈,如w5500。或者是其他的一些串口转wifi模块,如经典的esp8266等。

    作为软件工程师,自然重点是关注软件协议栈。但是,哪怕是上面罗列这几种轻量级的tcp/ip协议栈,源码量都是在万行以上级别的,更别说Linux系统里面动则几十上百万行tcp协议栈了。tcp/ip协议是一个非常庞大的协议族,初学者在研究它的时候,往往容易在细节里面迷失,捉不到重点来学习,更谈不上整体把握。一般学着学着就被劝退了。

    笔者在职业生涯前期也从过不少单片机开发工作,对上面的几个开源tcp协议栈也略有研究,只不过这些tcp协议栈主要运行在裸机或者是RTOS下,需要依赖相应的硬件开发板。目前本人主要从事于Linux行业,恰好Linux系統现在较为流行,于是给大家分享一个tcp协议栈--level-ip。level-ip可以直接运行在Linux系统中,不需要其他额外的硬件,希望手中有Linux系统的网络爱好者不要错过它

    该tcp协议栈运行在Linux用户空间,与应用程序完全隔离。这个机制模拟了Linux内核的tcp协议栈,它们都可以为其他应用程序提供网络链接服务。比如说,它可以为curl应用程序提供抓取网页的功能。ps:这是借助Linux虚拟网卡实现的。

    该tcp协议栈源码已经托管在GitHub:https://github.com/EmbedHacker/level-ip

    GitHub上level-ip的README.md已经详细说明了它实现的具体功能,有兴趣的读者可以去了解一下,再决定要不要阅读本文。

    level-ip架构设计

    level-ip整体软件架构其实并不复杂,我们从数据的发送流程,可以轻松理解它的全部设计, 如下图所示:

    下面详细给大家讲解一下,每层设计的功能

    • 应用程序:主要使用Socket API开发的应用程序,如我们常用的NetUtils工具(curl、wget等)

    • level-ip:运行在Linux用户空间的tcp/ip协议栈

    • 虚拟网卡/tun:中转站,把level-ip协议栈的数据转发给物理网卡,或者是把物理网卡的数据转发给level-ip协议栈

    • 物理网卡:收发以太网链路上的数据

    软件运行原理

    有了上面对level-ip的架构把握之后,我们从最底层开始讲解软件的运行原理。这样子分析下来,我们将对软件的底层到应用都有一个深入的把握。我们也将会在代码层面上,一窥tcp协议栈的核心理论的全貌。一旦在源码级别上,调试和掌握了tcp/ip协议栈,将带来极大的满足感和成就感,这种记忆是难以磨灭的。

    我们先从底层开始,一步步先把这个软件的架构了解清楚,然后尝试把它跑起来,后面我们深入学习的时候,就能边阅读代码边调试了。

    一、以太网=》物理网卡

    检查Linux系统上的物理网卡,至少要保证能链接外网,否则虚拟网卡也难以借助物理网卡进行外网链接。

    检测以太网和物理网卡链接是否正常的方法很简单,我们直接使用ping命令,测试是否能ping同百度网址即可:

    ping www.baidu.com
    

    如果能正常ping通,我们可以继续进行下一步,结果如下图:

    如果不能ping通,请自行百度/谷歌解决。

    二、物理网卡=》虚拟网卡

    从物理网卡到虚拟网卡之间的数据转发,我们可以通过iptables工具来设置netfilter防火墙来实现。

    (2.1) 首先,我们需要安装iptables工具,使用apt命令安装即可,如下图:

    sudo apt install iptables
    

    如果是系统自带iptables工具,则无需再安装,如下图:

    (2.2) 接下来我们需要Linux系统充当一个路由器,来帮助我们实现物理网卡和虚拟网卡之间的数据传输。执行以下命令开启Linux路由器功能:

    sudo sysctl -w net.ipv4.ip_forward=1
    

    执行成功如下图:

    (2.3) 继续配置防火墙,允许虚拟网卡的数据包通过,执行命令如下;

    sudo iptables -I INPUT --source 10.0.0.0/24 -j ACCEPT
    

    命令执行成功后,默认无信息输出

    (2.4) 使用ifconfig -a命令查看物理网卡的接口名称,我这里的物理网卡是enp0s3,如下图:

    (2.5) 配置 NAT,修改发送到互联网的数据包的源地址为enp0s3(物理网卡接口),执行以下命令:

    sudo iptables -t nat -I POSTROUTING --out-interface enp0s3 -j MASQUERADE
    

    注意:要把命令中的物理物理网卡接口,修改为自己真实机器上的接口。

    (2.6) 先创建一个虚拟网卡设备,此时的虚拟网卡是一个新建的设备文件,现在并没有真正的虚拟网卡功能,后面会讲解虚拟网卡设备的生成原理

    sudo mknod /dev/net/tap c 10 200
    sudo chmod 0666 /dev/net/tap
    

    (2.7) 最后设置物理网卡enp0s3和虚拟网卡tap的数据相互转发,执行以下命令:

    #物理网卡转发虚拟网卡
    sudo iptables -I FORWARD --in-interface enp0s3 --out-interface tap0 -j ACCEPT
    
    #虚拟网卡转发物理网卡
    udo iptables -I FORWARD --in-interface tap0 --out-interface enp0s3 -j ACCEPT
    

    到这里,物理网卡和虚拟网卡的数据转发就完成了。

    三、虚拟网卡=》level-ip

    Linux虚拟网卡介绍

    虚拟网卡tun/tap驱动是一个开源项目,Linux内核在2.4以后的版本已经是默认编译tun/tap驱动到内核中去了。使用以下命令可以查看Linux系统中的虚拟网卡设备:

    ls /dev/net/tun
    

    结果如下图:

    ps:如果你的Linux开发板中找不到这个虚拟网卡设备,那么需要重新编译你的Linux内核时,编译时检查是否已经配置了CONFIG_TUN宏。

    tun/tap驱动原理分析

    对驱动不感兴趣的读者,可跳过这一小节,无伤大雅!

    顾名思义,tun/tap作为虚拟网卡驱动,肯定是不会直接使用物理网卡来收发数据的。那么它是如何巧妙地进行网络数据收发呢?这就要说起Linux系统下的设备驱动了。

    Linux内核中有一个网络设备管理层,处于网络设备驱动和协议栈之间,负责衔接它们之间的数据交互。驱动不需要了解协议栈的细节,协议栈也不需要了解设备驱动的细节。

    但是,我们这里不仅是希望教会大家怎么使用,更希望把虚拟网卡驱动的原理尽可能地说清楚,才能做到真正地了解透彻我们这个tcp协议栈的整体机制。

    下面的内容,需要大家对Linux设备驱动有一定的基础,最起码要知道最简单的字符设备是怎么生成的,网络设备驱动主要的几个注册、使用接口等。如果不清楚如何通过open、write、read、close等接口来实现用户态和内核态的数据交互的话,建议先去百度/谷歌一下相关基础知识。

    tun/tap驱动程序中有两条主线,我们先感性认识一下它,如下图:

     +----------+
    | internet |
    +----|-----+
    +----|-----+
    |   eth0   |
    +----|-----+
    +----|-----+
    |  bridge  |
    +----|-----+
    +----|---------+
    |   tap0       |
    |--------------|
    | /dev/net/tun |
    +--|----|---|--+
      poll  |   |
       |  read  |
       |    |  write
    +--|----|---|--+
    | my netstack  |
    +--------------+
    
    • 字符设备驱动,负责内核与用户态之间的tcp数据传送

    • 网卡设备驱动,负责内核tcp数据在物理链路的收发

    上面的图可能不太直观,觉得抽象的话,可以直接看下面的图,总之先感性理解它的两条主线就可以了。

    如下图所示:

    下面以4.19.71内核源码进行分析:

    我们先来看第一个主线--字符设备驱动

    字符设备驱动

    在内核源码的drivers/net目录下,存在一个tun.c文件,这个c文件就是tun/tap的驱动程序,我们先来看程序入口:

    module_init(tun_init);
    module_exit(tun_cleanup);
    MODULE_DESCRIPTION(DRV_DESCRIPTION);
    MODULE_AUTHOR(DRV_COPYRIGHT);
    MODULE_LICENSE("GPL");
    MODULE_ALIAS_MISCDEV(TUN_MINOR);
    MODULE_ALIAS("devname:net/tun");
    

    很明显,tun_init为驱动程序入口,该函数源码如下:

    static int __init tun_init(void)
    {
    	int ret = 0;
    
    
    	pr_info("%s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
    
    
    	ret = rtnl_link_register(&tun_link_ops);
    	if (ret) {
    		pr_err("Can't register link_ops\n");
    		goto err_linkops;
    	}
    
    
    	ret = misc_register(&tun_miscdev);
    	if (ret) {
    		pr_err("Can't register misc device %d\n", TUN_MINOR);
    		goto err_misc;
    	}
    
    
    	ret = register_netdevice_notifier(&tun_notifier_block);
    	if (ret) {
    		pr_err("Can't register netdevice notifier\n");
    		goto err_notifier;
    	}
    
    
    	return  0;
    
    
    err_notifier:
    	misc_deregister(&tun_miscdev);
    err_misc:
    	rtnl_link_unregister(&tun_link_ops);
    err_linkops:
    	return ret;
    }
    

    重点在第13行,通过misc_register()函数把tun/tap注册为杂类设备,它的参数tun_miscdev是一个杂类设备结构体,定义如下:

    static struct miscdevice tun_miscdev = {
    	.minor = TUN_MINOR,
    	.name = "tun",
    	.nodename = "net/tun",
    	.fops = &tun_fops,
    };
    

    在这个结构体中,tun_fops为tun/tap设备节点对应的文件访问接口,如下图:

    static const struct file_operations tun_fops = {
    	.owner	= THIS_MODULE,
    	.llseek = no_llseek,
    	.read_iter  = tun_chr_read_iter,
    	.write_iter = tun_chr_write_iter,
    	.poll	= tun_chr_poll,
    	.unlocked_ioctl	= tun_chr_ioctl,
    #ifdef CONFIG_COMPAT
    	.compat_ioctl = tun_chr_compat_ioctl,
    #endif
    	.open	= tun_chr_open,
    	.release = tun_chr_close,
    	.fasync = tun_chr_fasync,
    #ifdef CONFIG_PROC_FS
    	.show_fdinfo = tun_chr_show_fdinfo,
    #endif
    };
    

    这里我们重点关注tun_chr_open和tun_chr_ioctl,这两个函数是引出第二个主线--网络设备驱动的关键。

    网络设备驱动

    我们先来看tun_chr_open函数,这个函数做了两件重要的事情,一个是构建了真正的tun驱动文件tun_file,并把它的指针记录在/dev/net/tun文件中。

    tfile = (struct tun_file *)sk_alloc(net, AF_UNSPEC, GFP_KERNEL, &tun_proto, 0);
    

    接着初始化网络设备文件的真正操作接口:

    tfile->socket.file = file;
    tfile->socket.ops = &tun_socket_ops;
    

    tun_socket_ops为网络设备文件的收发数据接口:

    static const struct proto_ops tun_socket_ops = {
    	.peek_len = tun_peek_len,
    	.sendmsg = tun_sendmsg,
    	.recvmsg = tun_recvmsg,
    };
    

    再看tun_chr_ioctl函数

    在tun_chr_ioctl函数里面,也做了两条重要的事情,分别是就是 调用tun_net_init函数来初始化网络设备的读写函数接口,然后调用regisre_netdev来注册生成相应的网络设备。

    tun_chr_ioctl()->文件操作模式是否为TUNGETIFF
    ->tun_get_iff()
          ->tun_net_init()
          ->register_netdevice()
    
    使用虚拟网卡驱动

    从上面的分析,我们已经知道了,我们实际上是通过控制字符设备,来注册使用网络设备的,虚拟网卡下面我们再梳理一下它的整个工作过程:

    tun/tap设备驱动通过字符设备文件来实现数据从用户区的获取(open /read/write等)。发送数据时tun/tap设备也不是发送到物理链路,而是通过虚拟网络设备来进行发送,但因为网络设备是虚拟的,所以该网络设备的数据包只能在本机的其他物理网络设备上进行转发。

    如下图:

    localhost                   outside network
       kernel stack                usermode stack [ ./tapip ]
           |                         (10.0.0.1)
           |                 (write) |        . (read)
           |                        \|/      /|\
           |                         '        |
         tap0 <---- netif_rx() -----/dev/net/tun
    (10.0.0.2) `-- tun_net_xmit() ------------^
    

    四、level-ip=》应用程序

    应用程序中使用的Socket API会被我们自己写的动态库来接管,而不是直接使用内核的tcp服务。而在我们的动态库中,我们可以将通过本地的网络通信(socket unix域),来实现和level-ip的数据通信。

    如下图所示:

    体验level-ip跑起来

    1. 获取Level-IP源码

      git clone https://github.com/EmbedHacker/level-ip
      
    2. 安装libcap-dev工具,以后需要用它来修改可执行程序的权限

      sudo apt install libcab-dev
      
    3. 确保系统安装gcc、make工具后,编译所有的目标文件

      make all
      
    4. 开启路由功能

      sudo sysctl -w net.ipv4.ip_forward=1
      
    5. 接受虚拟网卡的输入信息

      sudo iptables -I INPUT --source 10.0.0.0/24 -j ACCEPT
      
    6. 伪装物理网卡的ip,注意enp0s3为物理网卡,用户应根据ifconfig命令的查询结果修改

      sudo iptables -t nat -I POSTROUTING --out-interface enp0s3 -j MASQUERADE
      
    7. 设置物理网卡数据转发给虚拟网卡,注意修改物理网卡!!

      sudo iptables -I FORWARD --in-interface enp0s3 --out-interface tap0 -j ACCEPT
      
    8. 设置虚拟网卡数据转发给物理网卡,注意修改物理网卡!!

      sudo iptables -I FORWARD --in-interface tap0 --out-interface enp0s3 -j ACCEPT
      
    9. 运行tcp协议栈

      ./lvl-ip
      
    10. 重新打开另一个端口,运行curl应用程序,抓取百度网址

      cd tools
      ./level-ip ../apps/curl/curl www.baidu.com 80
      

    如果curl程序和tcp协议栈正常运行,则抓取结果如下:

    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Cache-Control: no-cache
    Content-Length: 14615
    Content-Type: text/html
    Date: Mon, 22 Jun 2020 14:03:20 GMT
    P3p: CP=" OTI DSP COR IVA OUR IND COM "
    P3p: CP=" OTI DSP COR IVA OUR IND COM "
    Pragma: no-cache
    Server: BWS/1.1
    Set-Cookie: BAIDUID=EE1559CC045E03490CEE4C7D88B5DC37:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: BIDUPSID=EE1559CC045E03490CEE4C7D88B5DC37; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: PSTM=1592834600; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: BAIDUID=EE1559CC045E03491F87D3CE34948683:FG=1; max-age=31536000; expires=Tue, 22-Jun-21 14:03:20 GMT; domain=.baidu.com; path=/; version=1; comment=bd
    Traceid: 1592834600066917530611219588553201043838
    Vary: Accept-Encoding
    X-Ua-Compatible: IE=Edge,chrome=1
    Connection: close
    
    
    <!DOCTYPE html><!--STATUS OK-->
    <html>
    <head>
    	<meta http-equiv="content-type" content="text/html;charset=utf-8">
    	<meta http-equiv="X-UA-Compatible" content="IE=Edge">
    	<link rel="dns-prefetch" href="//s1.bdstatic.com"/>
    	<link rel="dns-prefetch" href="//t1.baidu.com"/>
    	<link rel="dns-prefetch" href="//t2.baidu.com"/>
    	<link rel="dns-prefetch" href="//t3.baidu.com"/>
    	<link rel="dns-prefetch" href="//t10.baidu.com"/>
    	<link rel="dns-prefetch" href="//t11.baidu.com"/>
    	<link rel="dns-prefetch" href="//t12.baidu.com"/>
    	<link rel="dns-prefetch" href="//b1.bdstatic.com"/>
    	<title>百度一下,你就知道</title>
    	<link href="http://s1.bdstatic.com/r/www/cache/static/home/css/index.css" rel="stylesheet" type="text/css" />
    ...
    
    
    

    恭喜你把level-ip软件跑起来了,我将为它写更多的源码分析文章,敬请期待!

    如果有兴趣了解更多level-ip的源码分析,欢迎关注我的公众号:embed linux share!


    你的锅我不背!且看职责链模式

    我想把你的x86当单片机玩

    从RTOS到Linux0.12进阶之路

    嵌入式,真的不需要单元测试?

    陪伴是最长情的告白

    为你推送最实用的编程知识

    识别二维码

    关注我们

    点在看~

    捧个人场就行~

    展开全文
  • 它是一个开源操作系统,可以在不同的硬件平台上运行。它为用户提供了免费的低成本操作系统。这是一个用户友好的环境,他们可以在其中轻松修改和创建源代码的变体。 2.谁发明了Linux?解释Linux的历史? 回答:...

    Linux初学者面试问题

    Linux基本面试问题

    1.什么是Linux?

    回答: Linux是基于Linux内核的操作系统。它是一个开源操作系统,可以在不同的硬件平台上运行。它为用户提供了免费的低成本操作系统。这是一个用户友好的环境,他们可以在其中轻松修改和创建源代码的变体。

    2.谁发明了Linux?解释Linux的历史?

    回答:  Linus Torvalds创建了Linux。莱纳斯·托瓦尔兹(Linus Torvalds)于1991年在芬兰赫尔辛基大学(University of Helsinki)求学。他开始自行编写代码以免费获得Unix的学术版本。后来,它作为Linux Kernel变得流行。

    3. Linux和Unix有什么区别?

    回答: Linux与Unix

    LinuxUnix系统
    提供付费和免费分发。不同级别的Unix使用不同的付费结构。
    Linux主要使用带有可选命令行界面的GUIUnix使用命令行界面
    Linux OS是便携式的,可以在不同的硬盘中执行Unix OS不可移植。
    Linux由全球Linux社区开发。Unix由AT&T开发人员开发。
    Linux是免费的。它是在GNU许可下通过互联网下载的。大多数类似Unix的操作系统不是免费的。
    Linux用于家用PC,电话等。Unix用于服务器系统。

    和其他一些区别。

    Linux是Unix的克隆版本。但是,如果考虑可移植操作系统接口(POSIX)标准,则可以将Linux视为UNIX。

    • Linux只是核心

    所有Linux发行版都包括GUI系统,GNU实用程序,安装和管理工具,GNU c / c ++编译器,编辑器(vi)以及各种应用程序,例如OpenOffice,Firefox。

    UNIX操作系统被认为是完整的OS,因为一切都来自一个供应商。

    • 安全与防火墙

    Linux随附了基于Netfilter和IPTables的开源防火墙工具,可保护您的服务器和台式机免受黑客和黑客的攻击。UNIX操作系统带有自己的防火墙产品。 

    • 备份与恢复

    UNIX和Linux带有自己的一套工具,用于将数据备份到磁带和其他备份介质。但是,Linux和UNIX共享一些通用工具,例如tar,转储/还原和cpio等。

    4. Linux操作系统的核心是什么?

    回答:内核是Linux操作系统的核心。

    5.什么是Linux内核?

    回答:内核是操作系统的心脏。它充当软件和硬件之间的桥梁。如果软件请求硬件,则内核将在软件和硬件之间传递数据。例如,如果您想播放一首歌曲,则应启动默认播放器,它会请求内核播放一首歌曲,现在,内核将与硬件联系以寻求许可或寻求硬件组件,就像您插入任何耳机一样。装置。大多数Android手机使用Linux内核。 

    是的,内核可以编辑,因为它是根据通用公共许可证发行的。

    6.什么是BASH?

    回答:  Bash是Brian Fox为GNU项目编写的Unix shell和命令处理器。它是免费软件,可以代替Bourne Shell。这是一个解释后的未编译过程,也可以在终端窗口中运行。这使用户可以编写命令并引起动作。Bash能够从Shell脚本读取命令。

    7.什么是LILO?

    回答:  LILO表示Linux Loader是用于Linux操作系统的引导加载程序。大多数Linux操作系统使用LILO将操作系统引导到主内存中以启动操作。

    8.什么是CLI?

    回答:  CLI表示命令语言解释器。它与计算机程序进行交互,用户在其中以文本行的形式发出命令。它也与计算机终端交互,该界面接受文本行并将其作为命令转换为操作系统。 

    9.  开源的优势是什么?

    回答:   Linux是最早的开源技术之一,许多程序员添加了对用户完全开放的软件,这意味着您可以下载文件并随意更改代码。它为用户提供了多种选择,并提高了安全性。

    10.开源的缺点是什么?

    回答: 下面提到的开源操作系统的缺点

    1. 使用困难 
    2. 相容性问题
    3. 责任与保证
    4. 隐藏费用

    11.什么是Shell

    回答:  Shell是一个计算机程序,充当用户和内核之间的接口。用户可以通过在Shell上编写程序,命令和脚本来与内核进行通信。它接受人类可读的命令,并将其转换为内核可理解的语言。

    12. Linux中有几种类型的Shell? 

    回答:它们是Linux中的五个Shell:

    • C Shell(csh):类似于C语法,并提供拼写检查和作业控制。
    • Korn Shell(ksh):是一种高级编程语言Shell。
    • Z Shell(Zsh):它提供了一些独特的性质,例如观察登录/注销监视,文件名生成,启动文件,结束注释。 
    • Bourne Again Shell(bash):这是Linux发行版的默认设置。
    • 友好的交互式Shell(Fish):它提供基于Web的配置,自动建议等。 

    13. Linux的基本组件是什么?

    回答:   Linux的基本组件

    1. 内核:它是Linux的核心组件,它充当软件和硬件之间的接口。  
    2. Shell:它充当用户和内核之间的接口。
    3. GUI:   它代表图形用户界面,这是用户与系统交互的另一种方式。但这与图像,按钮,用于交互的文本框不同。
    4. 系统实用程序:这些是允许用户管理计算机的软件功能。
    5. 应用程序:旨在执行一组任务的一组功能。

    14.发出命令时如何打开命令提示符?

    回答:通过按CTRL + ALT + T或在菜单搜索栏中提供终端来启动终端。

    15.什么是交换空间?

    回答:当物理Ram内存用完时,将使用交换空间。它将Ram非活动页面移动到交换空间。它可以以专用交换分区或交换文件的形式考虑。

    16.什么是GUI?

    回答: GUI表示图形用户界面。它是一种人机界面,使用可以通过鼠标操作的窗口,图像,图标和菜单。电子产品中的大多数现代应用程序都通过GUI与用户通信。GUI是使用按钮,菜单,消息框等的图形和文本交互的组合。

    17.解释Linux中的文件权限类型?

    回答:每个文件或目录都具有3个权限

    他们是 

    1. Read--它是指只有他们可以读取该文件。
    2. Write--这是指他们可以写入文件或修改目录的文件。
    3. Execute--影响用户执行文件或查看目录文件的能力。 

    18.环境变量是什么?

    回答:它们是动态值,会影响计算机上程序的过程。它们存在于每个操作系统中,并且它们的类型可能有所不同。可以创建,编辑,保存和删除它们,还可以提供有关系统行为的信息。

    20.什么是符号链接? 

    回答:它将使用其路径重定向到另一个文件。目标文件不包含任何数据。符号链接重定向到文件系统中某个位置的另一个条目。如果删除了目标文件,则将删除指向该文件的链接,但不会删除该文件。

    21.什么是硬链接?

    回答:硬链接是Linux上现有文件的另一个名称。我们可以为任何文件创建如此多的硬链接。他们可以为其他硬链接创建链接。

    22.什么是重定向?

    回答:重定向可以定义为更改标准输入和输出设备。要使用重定向元字符,您可以重定向文件或程序。 

    23.什么是守护程序?

    回答:守护程序是一个后台进程,它接受来自其他计算机的服务请求,大多数操作系统使用其他形式的守护程序。  

    24.描述根帐户?

    回答: Root是用户名,默认情况下可以访问所有文件和命令。超级用户可以执行许多操作,但是普通用户不能执行诸如安装软件,更改文件权限等操作。

    25.解释虚拟桌面吗?

    回答:当您面临如何管理桌面上的多个窗口的问题时,虚拟桌面是一种用户界面,虚拟桌面可以作为替代方法。虚拟桌面存储远程服务器,并允许您在干净的状态上使用一个或多个程序。 

    26.使用vi编辑器时有哪些不同的模式?

    回答: vi编辑器中有三种模式。他们是 

    • 命令模式/常规模式
    • 插入模式/编辑模式。
    • 防爆模式/更换模式。 

    27.什么是inode和进程ID?

    回答: inode是赋予每个文件的唯一名称,进程id是赋予每个进程的唯一名称。 

    28. Linux中的进程状态是什么?

    回答:  Linux中的五个过程状态。他们是

    1. 新建/就绪:已创建一个新进程并准备运行。
    2. 正在运行:正在执行该进程。
    3. 阻止/等待:进程正在等待用户输入。 
    4. 终止/完成:进程已完成执行或被操作系统终止。 
    5. 僵尸:进程已删除,但仍在进程表中存在有关该进程的信息。

    Linux进程状态

    29.解释Linux中的流程管理系统调用吗?

    回答:  Linux中的流程管理系统调用:

    • fork():用于创建新进程。
    • exec():执行新进程。
    • wait():等到进程执行。
    • exit():退出进程。

    系统调用以获取进程ID:

    • getpid():查找唯一的进程ID。 
    • getppid():查找唯一的父进程ID。 

    30.解释Linux中的文件权限组?

    回答: 每个文件和目录都有三个基于用户的权限组。

    他们是:

    1. 所有者:所有者只需要访问文件或目录,就不会影响其他用户的操作。
    2. 组:这些权限仅适用于已分配给文件或目录的组。它们不会影响其他用户的操作。
    3. 所有用户:这些权限适用于系统上的所有用户。

    31.什么是Linux中的文件系统?

    回答: Linux文件系统存储和处理数据。没有文件系统,它将无法知道文件的起始位置和文件的结束位置。

    32.解释Linux中不同的文件系统类型吗?

     

    订阅我们的YouTube频道以获取新的更新。

     
     

    回答:在Linux中,有许多文件系统:

    Ext,Ext2,Ext3,Ext4,JFS,XFS,btrfs,ufs,autofs,devpts,ntfs和交换。

    Linux初学者教程

    Linux管理员面试问题

    32.为什么需要LVM?

    回答: LVM代表大容量管理,它是一种存储管理设备。用户可以创建,调整大小和删除LVM分区。它增加了抽象性,灵活性和控制性。LVM用于将现有存储设备收集到该组中并分配逻辑单元。 

    33.什么是umask?

    回答: unmask代表用户文件创建模式。用户创建任何文件时,它具有默认文件权限。因此,取消屏蔽将对新创建的文件指定很少的限制(它控制文件权限)。

    1个
    umask [-S] [mask]

    34.如何为用户永久设置面罩? 

    回答:如果调用unmask命令时不带任何参数,则表示它将显示当前掩码。 

    要永久设置取消遮罩,我们有两种类型。

    他们是:

    • Ocotal表示。
    • 符号表示。

    35.在Linux中什么是网络绑定?

    回答: 网络绑定是将两个以上的网络接口组合成一个网络接口的过程。它通过增加网络吞吐量和带宽来提供性能改进和冗余。无需担心一个接口关闭或拔出,因为另一个接口可以工作。绑定界面的行为取决于绑定方法。 

    36. Linux中的网络绑定有哪些不同的模式?

    答: 

    • Mode-0(balance-rr):这是默认模式,基于轮询策略。它提供容错和负载平衡功能。它使用轮询方式来传输数据包。
    • 模式1(active-backup):它基于主动备份策略,只有一个从机将在频带中起作用,而另一个将在其他从机发生故障时起作用。它还提供了容错能力。
    • 模式2(balance-xor):设置源Mac地址和目标Mac地址之间的异或模式,以提供容错能力。
    • 模式3(broadcast):它基于广播策略,并在从属接口中传输所有内容。它还提供了容错能力,并且只能用于特定目的。
    • 模式4(802.3ad):这是一种动态聚合模式,它创建了具有相同速度的聚合组。它使用传输哈希方法选择从站以进行传出流量。
    • 模式5(balance-tlb):传出流量是根据从站上的当前负载,而传入流量是从站接收的。这称为自适应发送负载平衡模式。 
    • 模式6(balance-alb):这是一种自适应负载平衡模式。它不需要任何开关支持。 

    37.如何查看默认路由和路由表?

    回答:   要显示默认路由和路由表,我们使用以下命令。

    1个
    2
    3
    4
    5
    $ route-n
     
    $ nestat-rn
     
    $ ip

    38.如何检查Linux服务器中正在侦听哪些端口?

    回答:我们有两个命令来检查Linux Server中正在侦听哪些端口。以下是两个命令 

    1个
    2
    # netstat --listen
    # netstat -l

    39.内核模块位于何处?

    回答: lib / modules / kernel-version /,此目录存储有关Linux系统下已编译驱动器的所有信息。使用lsmod命令,我们还可以看到已安装的内核模块。 

    40.如何在Linux中更改默认运行级别?

    回答:要更改Linux中的默认运行级别,请使用init命令。 

    41.如何使用nfs共享目录?

    回答:   要使用NFS共享目录,请首先编辑配置文件和'/ etc / exports'并添加目录名称' /'。现在,重新启动NFS服务。

    42. SMTP,DNS,FTP,DHCP,SSH和Squid使用的默认端口是什么?

    Ans。 详情如下

    服务端口
    SMTP25
    DNS53
    FTP20(Data Transfer) 21(Connections Established)
    DHCP68(dhcp client), 67(DHCP server)
    SSH22
    Squid3128

    43.如何在Linux中锁定用户帐户?

    回答:为了安全起见,已完成锁定用户帐户的操作,以便未经授权的用户无法登录。因此,我们有几种方法可以锁定用户帐户。其中一些在下面。 

    1. 使用passwd命令锁定或禁用密码。
    2. 使用usermod命令或chage命令使用户帐户过期。
    3. 使用nologin命令(/ sbin / nologin)更改外壳。

    Linux命令面试问题

    44.什么是ls命令及其作用?

    回答:这是Linux中的基本命令之一。它用于列出文件系统中的所有文件和目录。zom

    句法: 

    <span style =“ color:#ecf0f1; background-color:#000000;”> ls [OPTIONS] [FILES] </ span>

    我们可以在不传递参数的情况下使用它,然后它将列出当前工作目录中的所有文件。文件将按字母顺序显示。 

    <span style =“ background-color:#000000; color:#ecf0f1;”>是</ span>

    要列出特定目录文件,请在语法中使用目录名称,请按照以下语法中的说明进行操作。

    ls / etc
    我们还可以使用语法传递多个目录名称,但以空格分隔。 

    ls / etc / var / etc / passwd

     45.在Linux中,tail命令是什么?

    回答: Tail命令打印给定数据的最后N行,默认情况下它打印10行。 

    句法: 

    尾部[OPTION] ... [FILE]

    例: 

    $ cat names.txt

    Tableau <br> SQL Server <br> Linux管理<br>现在,在不提供任何选项或输入的情况下检查语法。

    $ tail state.txt

    <span style =“ font-family:'courier new',courier,monospace;”> <span style =“ color:#222222; font-family:Verdana;”> <span style =“ white-space:pre-wrap ;“> <strong> <em>输出:</ em> </ strong> <br> </ span> </ span> </ span> Tableau <br> sql server <br> linux管理<span style =” font-family:'courier new',courier,monospace;“> <span style =” color:#222222; font-family:Verdana;“> <span style =” white-space:pre-wrap;“> <br > </ span> </ span> </ span>

    46. Linux中的grep命令是什么?

    回答: grep命令是一个过滤器,用于全局搜索正则表达式。

    句法:

    grep [选项]模式[文件]

    47. Linux中的ps命令是什么? 

    回答: ps命令显示系统的当前进程状态。并显示进程ID和其他一些相关数据。 

     

    句法: 

    Ps [选项]

    输出:

    1个
    2
    3
    4
    5
    6
    7
    [root@rhe17~]# ps
     
    PID TTY    TIME CMD
     
    12330 pts/0  00:00:00 bash
     
    21621 pts/0  00:00:00 ps

    如:ps -ef|grep tomcat (查询tomcat进程)

    48. Linux中的env命令是什么?

    回答: env是一个shell命令,用于打印当前环境变量的列表,它可以在另一个环境中运行另一个进程,而无需对当前环境进行任何修改。 

    1个
    env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]

    选件

    标签描述
    -i,-ignore-environment从一个空的环境开始。
    -0,--null输出行以0(空)字节而不是换行符结尾。
    -u,--unset = NAME从环境中删除变量NAME
    --help显示帮助消息并退出。

    49.什么是Linux中的top命令?

    回答:用于显示系统进程的top命令,它显示并更新排序的进程信息。 

    50. Linux中的netstat命令是什么?

    回答: netstat命令提供有关网络和路由表,接口静态信息以及有关系统的更多信息。

    51. 在Linux中,lsof命令是什么?

    回答: lsof表示文件列表,我们可以知道哪个进程打开了哪个文件。

    1个
    2
    #lsof
    -

    52.解释chmod命令吗?

    回答:此命令用于更改文件和目录的权限。这是一个重要的命令,因此,我将对其进行简要说明。因此,总的来说,共有三种权限,即读,写和执行,并由数字表示,如下所示。

    1. 4-读取权限
    2. 2-写入权限
    3. 1-执行权限

    句法:

    1个
    2
    3
    4
    5
    6
    7
    $ chmod options permissions file name 
     
    $ chmod [OPTION]... MODE[,MODE]... FILE...
     
    $ chmod [OPTION]... OCTAL-MODE FILE...
     
    $ chmod [OPTION]... --reference=RFILE FILE…

    53.解释chown命令吗?

    回答: Chown命令:命令“ chown”代表变更文件的所有者和组。此命令用于更改指定用户或组的一个或多个文件或文件夹的所有权。 

    句法:

    1个
    2
    3
    4
    $ chown [OPTION]… [OWNER][:[GROUP]] FILE…
                                    Or
     
      $ chown [OPTION]… –reference=RFILE FILE…

    54.在Linux中什么是cp命令?

    回答: cp命令: cp命令用于复制文件和目录。它还用于备份文件或目录。

    句法:

    $ cp文件名

    55.如何在Linux中从系统中删除文件或目录?

    回答:  rm命令:rm命令用于删除命令行上指定的目录或文件。删除任何文件或目录时,请务必小心。

    句法:

    rm文件名- 

    命令描述
    rm文件名删除单个文件。
    rm filename1,filename2,filename 3删除多个文件。
     rm * .pdf删除当前目录中的所有pdf文件。 
     rm -i 文件名-i表示在删除文件之前先进行确认
     rm -i 文件名删除文件而不提示
    rm -fv * .txt删除当前目录中的所有.txt文件而不提示

    56. Linux中的mkdir是什么?

    回答: mkdir,命令允许用户在Linux中创建目录。用户可以一次创建多个目录,并可以设置目录的权限。

    句法: 

    mkdir [选项...] [目录...]

    选项描述
    Directory要创建的目录的名称
    -m=mode, --mode=mode为创建的目录设置文件模式(权限等)
    -p, --parents创建父目录
    --v,--verbose详细输出。打印已创建目录的消息。
    --Z= context, --context=context如果使用的是SELinux,则此选项将每个创建的目录的安全性上下文设置为context。
    --help显示帮助消息并退出
    --version它显示版本信息并退出

    57.在Linux中解释rmdir命令?

    回答:  rmdir用于删除命令行上指定的每个目录。 

    句法: 

    1个
    rmdir [-p] [-v | –verbose] [–ignore-fail-on-non-empty] directories

    58.如何退出vi编辑器?

    回答:我们可以使用两个命令退出vi编辑器。他们是

    • Wq  wq命令保存当前工作并从vi编辑器退出。
    • q!: q!命令不会保存当前的工作,但是会从vi编辑器中退出。

    59.如何从vi中的文件中删除信息?

    回答: 以下命令用于在vi编辑器中从文件中删除信息。

    1. 命令x删除当前字符。
    2. 命令dd删除当前行。

    60.征募一些Linux文件内容命令?

    回答:文件内容命令

    1. head:显示文件的顶行。
    2. tail:显示文件的最后几行。
    3. cat:串联两个以上的文件。
    4. 更多:以寻呼机形式显示内容以在终端中查看。 

    Linux技术面试常见问题解答

    61.招募一些Linux发行商(Distros)及其用法?

    回答:我们有很多Linux发行商,其中,我们讨论了一些重要的发行商。

    • Linux Mint:稳定且强大。Linux Mint使用伴侣桌面和肉桂。 
    • Debian:它代表了健壮性,稳定性和上油良好的发布周期。这是用户友好的。Debian版本8将被版本9取代。
    • Ubuntu:它基于Debian,适用于台式机和服务器版本。  
    • openSUSE:对于新用户和现有用户来说,这是一个不错的选择。
    • Manjaro:它为新手和有经验的用户提供了愉快的体验。

    62.为什么我们使用LINUX? 

    回答: 我们有很多原因,其中列出了几个重要的原因。以下是

    • 高稳定性:非常稳定,不会导致崩溃,它可以像首次安装时一样快速运行。 
    • 安全性:这是一台可靠的服务器,可以为用户提供高安全性。在系统上使用Linux很容易避免病毒和恶意软件。攻击者无法更改系统中的任何更改,除非该用户以root用户身份登录。
    • 易于操作: Linux易于操作,并且我们可以轻松地安装到系统上,因为Linux的所有变体都有自己的软件存储库。您可以单击几次以定期更新系统,也可以设置自动更新。
    • 硬件兼容性: Linux可以在任何硬件上使用,它没有任何硬件限制。它有效地使用了所有系统资源。
    • 开源:源代码可用,因为它位于免费和开源软件(FOSS)下。ç¨äºlinuxæä½ç³»ç»

     

     

    63. Linux操作系统有哪些功能?

    回答:以下是Linux操作系统的功能

    • 可移植性:软件可以相同的方式在不同类型的硬件上运行。它可以随身携带笔式驱动器和存储卡。
    • 开源:免费提供源代码及其基于社区的开发项目。 
    • 多用户:多个用户可以同时使用ram,应用程序和运行程序。 
    • 多重编程多个程序或应用程序可以同时运行。 
    • Shell:它具有特殊的解释程序,您可以在其中执行系统的程序和命令。 
    • 安全性:它提供身份验证,授权和加密,以提供数据的安全性。 

    64.区分BASH和DOS?

    答: 

    重击多斯
    命令区分大小写命令不区分大小写
    反斜杠(/)表示目录分隔符'/'代表命令参数
    正斜杠“”表示转义字符''代表目录分隔符
    不遵循文件中的约定命名  遵循文件中的命名约定

    65.内部命令和外部命令是什么意思?

    答: 

    • 内部命令:直接由外壳运行的命令称为内部命令,没有单独的进程来运行命令。 
    • 外部命令: 内核运行的命令称为外部命令,每个命令都有其自己唯一的进程ID。

    Linux网络面试问题

    66. Linux中的PIPE是什么意思?

     
     

    回答:这是一种重定向形式,在Linux中使用,用于组合两个以上的命令,一个命令的输出可以作为下一个命令的输入。 

    句法:

    1个
    command_1 | command_2 | command_3 | .... | command_N

    67.描述父子进程如何相互通信?

    回答: 父进程通过使用管道,套接字,消息队列等与子进程进行通信。 

    68.什么是无状态Linux服务器?

    回答:这是一台集中式服务器,在工作站上没有任何存在状态。当特定系统的状态拍摄快照时,用户可能希望所有其他计算机都处于该特定状态,因此可能会出现这种情况。

    69.解释无状态Linux服务器的功能吗?

    答: 

    1. 存储每个系统的原型。
    2. 存储拍摄的快照。 
    3. 存储主目录。
    4. 使用LDAP,其中包含有关哪个快照应在哪个系统上运行的信息。 

    70.什么是僵尸进程?

    回答: 这是一个执行已完成但进程表中甚至存在信息的进程。由于子进程需要读取子进程的状态,因此发生在子进程中。一旦使用wait系统调用完成了该任务,则僵尸进程将从进程表中删除。这被称为僵尸进程。

    71.解释Ctrl + Alt + Del组合键在Linux操作系统上的工作吗?

    回答: 在Linux中,Ctrl + Alt + Del键用于重新启动计算机,并且在重新引导系统之前它不会显示任何确认消息。 

    72.为什么Linux被认为比其他操作系统更安全?

    回答:   Linux是一种开源操作系统,如今它在技术市场中正在迅速增长。我们有几个理由说明Linux比其他操作系统更安全的原因。

    • 帐户特权: Linux仅允许少数用户访问系统。因此,该病毒无法攻击整个系统,它可能仅导致系统中的几个文件。 
    • 强大的社区: Linux用户在打开文件之前首先完成了文件。这样他们就可以避免系统遭受漏洞攻击。 
    • iptables: Linux使用的iptables,因为它检查系统的安全圈。 
    • 不同的工作环境: Linux系统具有不同的工作环境,例如Linux Mint,Debian,Arch等,这些工作环境可以防御病毒。
    • 在Linux中记录:它维护日志历史记录,因为以后可以轻松查看系统文件的详细信息。 
    • 很少的用户: Linux用户比其他用户少,因为这种安全性会更多。

    73.在Linux中,tail命令是什么?

    回答: tail命令显示文件的最后部分。通常,用户不需要每个日志行即可进行故障排除。相反,您想查看日志中有关应用程序最近请求的内容。

    尾例:

    $ tail -n 100 / var / log / httpd / access_log

    74.在Linux中什么是cat命令?

    回答:  在Linux中,cat命令连接并打印文件。用户可能发出cat检查您的依赖项文件的内容或确认您已经在本地构建的应用程序的版本。

    猫示例:

    1个
    2
    3
    $ cat requirements.txt
    flask
    flask_pymongo
     
    重要的Linux命令

     

    75. Linux中的grep命令是什么?

    回答:  grep搜索文件模式。如果要在另一个命令的输出中查找特定模式,则grep突出显示相关行。使用此grep命令搜索日志文件,特定进程等。

    grep示例: 

    1个
    2
    $ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start
    12-Jan-2018 17:08:35.542 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 681 ms

    76. Linux中的ps命令是什么?

    回答:  ps命令显示进程状态。使用此ps命令来确定正在运行的应用程序或确认预期的进程。

    ps命令示例:

    1个
    2
    3
    $ ps -ef
     
    $ ps -ef | grep tomcat

    77.在Linux中什么是env命令?

    Ans:  env命令允许用户设置或打印环境变量。在故障排除期间,用户会发现它对于检查错误的环境变量是否阻止您的应用程序启动很有用。

    env命令示例:

    1个
    2
    3
    4
    5
    6
    7
    8
    9
    $ env
    PYTHON_PIP_VERSION=9.0.1
    HOME=/root
    DB_NAME=test
    PATH=/usr/local/bin:/usr/local/sbin
    LANG=C.UTF-8
    PYTHON_VERSION=3.4.6
    PWD=/
    DB_URI=mongodb://database:27017/test

    78.什么是Linux中的top命令?

    回答:  top命令显示和更新排序的过程信息。使用此top命令来确定正在运行的进程以及它们消耗了多少内存和CPU。

    79. Linux中的netstat命令是什么?

    回答:  Linux中的netstat命令显示网络状态。此netstat命令显示正在使用的网络端口及其传入连接。

    80.在Linux中,lsof命令是什么?

    回答:命令ls列出了与您的应用程序关联的打开文件。

    81.在Linux中df命令是什么?

    回答:  用户可以使用df命令对磁盘空间问题进行故障排除。此处df表示显示可用磁盘空间。

    df命令示例:

    df -h

    82.在Linux中du命令是什么?

    Linux中的Ans: du命令用于检索有关哪些文件使用目录中磁盘空间的更多详细信息。

    du命令示例:

    1个
    2
    3
    4
    5
    6
    7
    8
    $ du -sh /var/log/*
    1.8M  /var/log/anaconda
    384K  /var/log/audit
    4.0K  /var/log/boot.log
    0 /var/log/chrony
    4.0K  /var/log/cron
    4.0K  /var/log/maillog
    64K /var/log/messages

    83.在Linux中什么是iptables命令?

    回答:  iptables命令阻止或允许Linux主机上的流量,类似于网络防火墙。此iptables命令可能会阻止某些应用程序接收或传输请求。

    Linux与Windows

    LINUX视窗
    Linux是  免费提供的必须购买Windows
    这是  一个开源操作系统它不是开源操作系统
    一个可以定制Linux没有自定义项
    提供高级安全性无法防御病毒和恶意软件攻击
    主分区和逻辑分区可启动仅在主分区时可以启动
    BackSlash分隔目录正斜杠分隔目录
    文件名区分大小写命名文件时不分大小写
     

    84. cd-命令做什么?

    回答:  cd-命令转到上一个目录。

    85. cd命令有什么作用?

    回答:  转到$ HOME目录

    86.(cd dir &&命令)做什么?

    回答:  cd dir &&命令转到dir,执行命令并返回当前目录。

    88. pushed命令有什么作用?

    回答:推送命令将当前目录放到堆栈上,以便您可以弹出它。

    Linux管理员面试问题

    89.什么是ls -lSr命令?

    回答:  ls-ISr命令按大小显示文件,最后显示最大文件。

    90.什么是du -s * | 排序-k1,1rn | 头命令用于?

    回答:  该命令显示当前目录中的顶级磁盘用户。

    91. du -hs / home / * |是什么?sort -k1,1h命令吗?

    回答:  此命令排序路径通过易于解释磁盘使用情况来实现。

    92.什么是df -h命令?

    回答:此命令显示已挂载文件系统上的可用空间。

    93.什么是df -i命令?

    回答: df -I命令显示已挂载文件系统上的空闲索引节点。

    94. fdisk -l命令的作用是什么?

    回答:  fdisk -I命令显示磁盘分区的大小和类型(以root身份运行)。

     查看Linux示例简历

    95.如何在Linux中使用一个端口杀死程序?

    回答: 使用此命令可以通过一个端口杀死程序:sudo fuser -k 8000 / tcp

    96.如何限制命令的内存使用量?

    回答:  ulimit -Sv 1000#1000 KBs = 1 MB
        ulimit -Sv unlimited#删除限制

    97.如何在Linux中获得文件的完整路径?

    <strong style =“ font-family:-apple-system,BlinkMacSystemFont,“ Segoe UI”,Roboto,Oxygen,Ubuntu,Cantarell,“ Open Sans”,“ Helvetica Neue”,sans-serif;颜色:#e74c3c;”>回答:</ strong>:使用以下命令:readlink -f file.txt

    98.如何列出tar.gz的内容并仅提取一个文件?

    回答:  使用以下命令:

    • tar tf file.tgz
    • tar xf file.tgz文件名

    99.您如何找到谁登录?

    回答:  使用此命令可查找登录人员:w

    100.如何检查每个目录对文件的权限?

    回答:  检测权限错误很有用,例如在配置Web服务器时。

    1个
    namei -l /path/to/file.txt

    101.每次修改文件时如何运行命令?

    回答:  使用此命令可以执行以下操作:

    1个
    2
    3
    4
    5
    6
    7
    while inotifywait -e close_write document.tex
     
    do
     
    make
     
    done

    102.如何将文本复制到剪贴板?

    回答:使用此命令:cat file.txt | xclip-选择剪贴板

    103.您如何检查资源使用情况?

    回答:使用此命令检查资源使用情况:/ usr / bin / time -v ls

    104.如何在有限的时间内运行命令?

    回答:使用此命令:超时10秒./script.sh

    #设置为
    true时每30分钟重新启动一次;超时30m ./script.sh; 完成

    105.如何在Linux中将两个已排序文件中的两行合并?

    回答:使用此命令:comm file1 file2。

    展开全文
  • Linux总结

    千次阅读 多人点赞 2020-01-14 20:36:45
    二 、初探Linux 2.1 Linux简介 2.2 Linux诞生简介 2.3 Linux的分类 三 、Linux文件系统概览 3.1 Linux文件系统简介 3.2 文件类型与目录结构 四 、Linux基本命令 4.1 目录切换命令 4.2 目录的操作命令(增删改...
  • 30款Linux 高性能网络开发库开源软件

    万次阅读 2019-04-23 19:29:57
    Chaos是一个基于Linux平台, reactor模式的网络事件, 目前仅支持TCP传输协议, 仅在x86_64下编译, 并遵循3-clause BSD开源协议. 在使用上, 可以说它很像boost asio, 可能是由于我对boost asio的接口设计很有爱...
  • linux系统下开发的modbus协议,支持modbus的RTU和ASCII方式。可运行在串口和网口方式。
  • linux网络编程Socket之TCP与UDP

    千次阅读 2017-08-24 17:57:35
    TCP/IP是个协议族,可分为三个层次:网络层、传输层和应用层。 网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 传输层中有TCP协议与UDP协议。 应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。 ...
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    Java面试总结 Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。...
  • 最小的基于DebianLinux系统,具有功能齐全的bash shell(具有GNU coreutils,而不是BusyBox),带有DHCP客户端的TCP / IP网络和APT设置,能够从Debian存储中安装任何软件包。
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
  • Comer and Stevens, Internetworking With TCP/IP Volume 3: Client-Server Programming and Applications (Linux/POSIX version), Prentice Hall, 2000. The standards for RTP and the RTP Control Protocol ...
  • https://blog.csdn.net/u014220105/article/details/84849570 可先参考相关描述,epoll实现tcp百万级高并发测试,代码仅用于测试和功能验证,并不是特别完善,不喜勿喷,欢迎指导
  • modbus是一个比较简单的...在此推荐一个不错的Modbusc++代码,项目比较完整,跨平台支持比较好,既可以在Linux下编译,也可以在windows下运行。 代码地址:https://github.com/lyqdy/ymodbus 下载后在tests目录下.
  • 开源的Socket,C++实现

    热门讨论 2009-06-16 19:00:42
    详细介绍socket编程,包括Win32和Linux,可移植,是学习网络编程的好东西。
  • Linux实用教程(第三版)

    万次阅读 多人点赞 2019-08-27 22:55:59
    第一章 Linux系统初步了解 本章内容 1.1 Linux系统简介 1.2 Linux系统的特点和组成 1.3 Linux版本介绍 1.4 Red Hat Linux系统概述 1.1 Linux系统简介 1.1.1 什么是Linux 1.1.2 Linux系统的产生 1.1.3 Linux...
  • linux系统调用socket(TCP使用总结)

    千次阅读 2020-02-12 19:47:10
    TCP/IP 4层模型:应用程、传输层(port)、网络程(ip)、链路层 2.udp 协议: 16位:源端口16位:目的端口 3. tcp 协议: TCP协议百度热搜词条 16:源端口号 16位:目的端口号 32位序列号 【发送sys时候携带的...
  • 西门子PLC通信开源库

    千次阅读 2020-04-27 00:17:06
    跨平台 NetToPLCSim https://sourceforge.net/projects/nettoplcsim/ PLC模拟器辅助工具 TCP/IP-Network extension for the PLC simulation software Siemens PLCSim (Step 7 V5.4/5.5). With NetToPLCSim you are ...
  • 有价值的C语言开源库

    千次阅读 多人点赞 2019-04-25 18:07:31
    Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, ...
  • Linux TCP/IP大合集

    千次阅读 2015-09-10 00:14:31
    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做 软件 ,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更...
  • libscapi是用于实现高性能安全的两方和多方计算协议的开源C ++(SCAPI代表“安全计算API”)。 它提供了可靠,高效且高度灵活的加密基础结构。 Libscapi由。 libscapi的目标是通过提供以下方面来促进学院和行业...
  • C++开源库大全

    千次阅读 2017-11-23 14:37:53
    程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。   标准库 C++ Standard Library:是一系列类和函数的集合,...
  • Linux以外的7种开源操作系统

    万次阅读 2017-01-19 13:50:33
    开源操作系统即公开源代码的操作系统软件,它遵循开源协议使用、编译和发布。自由和开放源代码软件中最著名的是Linux,它是一种类Unix的操作系统。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,752
精华内容 17,900
关键字:

linuxtcp开源库

linux 订阅