CppGuide社区 CppGuide社区
首页
  • 最新谷歌C++风格指南(含C++17/20)
  • C++17详解
  • C++20完全指南
  • C++23快速入门
  • C++语言面试问题集锦
  • 🔥C/C++后端开发常见面试题解析 (opens new window)
  • 网络编程面试题 (opens new window)
  • 网络编程面试题 答案详解 (opens new window)
  • 聊聊WebServer作面试项目那些事儿 (opens new window)
  • 字节跳动面试官现身说 (opens new window)
  • 技术简历指南 (opens new window)
  • 🔥交易系统开发岗位求职与面试指南 (opens new window)
  • 第1章 高频C++11重难点知识解析
  • 第2章 Linux GDB高级调试指南
  • 第3章 C++多线程编程从入门到进阶
  • 第4章 C++网络编程重难点解析
  • 第5章 网络通信故障排查常用命令
  • 第6章 高性能网络通信协议设计精要
  • 第7章 高性能服务结构设计
  • 第8章 Redis网络通信模块源码分析
  • 第9章 后端服务重要模块设计探索
  • 🚀 全部章节.pdf 下载 (opens new window)
  • 源码分析系列

    • leveldb源码分析
    • libevent源码分析
    • Memcached源码分析
    • TeamTalk源码分析
    • 优质源码分享 (opens new window)
    • 🔥远程控制软件gh0st源码分析
  • 从零手写C++项目系列

    • C++游戏编程入门(零基础学C++)
    • 🔥使用C++17从零开发一个调试器 (opens new window)
    • 🔥使用C++20从零构建一个完整的低延迟交易系统 (opens new window)
    • 🔥使用C++从零写一个C语言编译器 (opens new window)
    • 从零用C语言写一个Redis
  • Windows 10系统编程
  • 🔥Linux 5.x内核开发与调试 完全指南 (opens new window)
  • TCP源码实现超详细注释版.pdf (opens new window)
  • Go语言特性

    • Go开发实用指南
    • Go系统接口编程
    • 高效Go并发编程
    • Go性能调优
    • Go项目架构设计
  • Go项目实战

    • 使用Go从零开发一个数据库
    • 🔥使用Go从零开发一个编译器 (opens new window)
    • 🔥使用Go从零开发一个解释器 (opens new window)
    • 🔥用Go从零写一个编排器(类Kubernetes) (opens new window)
  • Rust编程

    • Rust编程指南
  • 数据库

    • SQL零基础指南
    • MySQL开发与调试指南
GitHub (opens new window)
首页
  • 最新谷歌C++风格指南(含C++17/20)
  • C++17详解
  • C++20完全指南
  • C++23快速入门
  • C++语言面试问题集锦
  • 🔥C/C++后端开发常见面试题解析 (opens new window)
  • 网络编程面试题 (opens new window)
  • 网络编程面试题 答案详解 (opens new window)
  • 聊聊WebServer作面试项目那些事儿 (opens new window)
  • 字节跳动面试官现身说 (opens new window)
  • 技术简历指南 (opens new window)
  • 🔥交易系统开发岗位求职与面试指南 (opens new window)
  • 第1章 高频C++11重难点知识解析
  • 第2章 Linux GDB高级调试指南
  • 第3章 C++多线程编程从入门到进阶
  • 第4章 C++网络编程重难点解析
  • 第5章 网络通信故障排查常用命令
  • 第6章 高性能网络通信协议设计精要
  • 第7章 高性能服务结构设计
  • 第8章 Redis网络通信模块源码分析
  • 第9章 后端服务重要模块设计探索
  • 🚀 全部章节.pdf 下载 (opens new window)
  • 源码分析系列

    • leveldb源码分析
    • libevent源码分析
    • Memcached源码分析
    • TeamTalk源码分析
    • 优质源码分享 (opens new window)
    • 🔥远程控制软件gh0st源码分析
  • 从零手写C++项目系列

    • C++游戏编程入门(零基础学C++)
    • 🔥使用C++17从零开发一个调试器 (opens new window)
    • 🔥使用C++20从零构建一个完整的低延迟交易系统 (opens new window)
    • 🔥使用C++从零写一个C语言编译器 (opens new window)
    • 从零用C语言写一个Redis
  • Windows 10系统编程
  • 🔥Linux 5.x内核开发与调试 完全指南 (opens new window)
  • TCP源码实现超详细注释版.pdf (opens new window)
  • Go语言特性

    • Go开发实用指南
    • Go系统接口编程
    • 高效Go并发编程
    • Go性能调优
    • Go项目架构设计
  • Go项目实战

    • 使用Go从零开发一个数据库
    • 🔥使用Go从零开发一个编译器 (opens new window)
    • 🔥使用Go从零开发一个解释器 (opens new window)
    • 🔥用Go从零写一个编排器(类Kubernetes) (opens new window)
  • Rust编程

    • Rust编程指南
  • 数据库

    • SQL零基础指南
    • MySQL开发与调试指南
GitHub (opens new window)
  • 第1章高频C++11重难点知识解析

  • 第2章Linux GDB高级调试指南

  • 第3章C++多线程编程从入门到进阶

  • 第4章C++网络编程重难点解析

  • 第5章网络通信故障排查常用命令

    • 5.1 ifconfig
    • 5.2 ping
    • 5.3 telnet
    • 5.4 netstat
    • 5.5 lsof
    • 5.6 nc
    • 5.7 curl
    • 5.8 tcpdump
  • 第6章高性能网络通信协议设计精要

  • 第7章高性能服务结构设计

  • 第8章Redis 网络通信模块源码分析

  • 第9章后端服务重要模块设计探索

  • C++后端开发进阶
  • 第5章网络通信故障排查常用命令
zhangxf
2023-04-05

5.6 nc

nc 即 netcat 命令,这个工具在排查网络故障时非常有用,功能非常强大,因而被业绩称为网络界的“瑞士军刀”,请读者务必掌握。默认系统是没有这个命令的,你需要安装一下,安装方法:

yum install nc
1

nc 命令常见的用法是模拟一个服务器程序被其他客户端连接,或者模拟一个客户端连接其他服务器,连接之后就可以进行数据收发。By default, nc(1) uses the TCP protocol. However, if you execute nc(1) with the -u flag,

then nc(1) will use the UDP protocol.我们来逐一介绍一下:

  • 模拟一个服务器程序

    使用 -l 选项(单词 listen 的首字母)在某个 ip 地址和端口号上开启一个侦听服务,以便让其他客户端连接。通常为了显示更详细的信息,会带上 -v 选项。

    示例如下:

    [root@iZ238vnojlyZ ~]# nc -v -l 127.0.0.1 6000
    Ncat: Version 6.40 ( http://nmap.org/ncat )
    Ncat: Listening on 127.0.0.1:6000
    
    1
    2
    3

    上述命令启动了一个侦听服务器,侦听 ip 地址为 127.0.0.1,侦听端口为 6000 ;如果你的机器可以被外网访问,你可以使用 0.0.0.0 这样的侦听地址(当然也可以使用其他公网 ip 作为侦听地址),示例:

    [root@iZ238vnojlyZ ~]# nc -v -l 0.0.0.0 6000
    Ncat: Version 6.40 ( http://nmap.org/ncat )
    Ncat: Listening on 0.0.0.0:6000
    
    1
    2
    3
  • 模拟一个客户端程序

    用 nc 命令模拟一个客户端程序时,我们不需要使用 -l 选项,直接写上 ip 地址(或域名,nc 命令可以自动解析域名)和端口号即可,示例如下:

    ## 连接百度 web 服务器
    [root@iZ238vnojlyZ ~]# nc -v www.baidu.com 80
    Ncat: Version 6.40 ( http://nmap.org/ncat )
    Ncat: Connected to 115.239.211.112:80.
    
    1
    2
    3
    4

    输出提示我们成功连接上百度 Web 服务器。

我们知道客户端连接服务器一般都是操作系统随机分配一个可用的端口号连接到服务器上去,使用 nc 命令作为客户端时可以使用 -p 选项指定使用哪个端口号连接服务器,例如,我们希望通过本地 5555 端口连接百度的 Web 服务器,可以这么输入:

[root@iZ238vnojlyZ ~]# nc -v -p 5555 www.baidu.com 80
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 115.239.211.112:80.
1
2
3

再开一个 shell 窗口,我们使用上文中介绍的 lsof 命令验证一下,是否确实通过 5555 端口连接上了百度 Web 服务器。

[root@iZ238vnojlyZ ~]# lsof -Pni | grep nc
nc        32610    root    3u  IPv4 113369437      0t0  TCP 120.55.94.78:5555->115.239.211.112:80 (ESTABLISHED)
1
2

结果确实如我们所期望的。

当然,当使用 nc 命令与对端建立连接后,我们可以发送消息。下面通过一个具体的例子来演示一下这个过程

  1. 使用 nc -v -l 0.0.0.0 6000 模拟一个侦听服务,再新建一个 shell 窗口利用 nc -v 127.0.0.1 6000 模拟一个客户端程序连接刚才的服务器。
  2. 此时在客户端和服务器就可以相互发消息了。我们可以达到一个简化版的 IM 软件聊天效果:

客户端效果:

服务器端效果:

如果你在使用 nc 命令发消息时不小心输入错误,可以使用 Ctrl + Backspace 键删除。

nc 命令默认会将 \n 作为每条消息的结束标志,如果你指定了 -C 选项,将会使用 \r\n 作为消息结束标志。

nc 命令不仅可以发消息,也能发文件。我们也来演示一下:

需要注意的是是接收文件的一方是服务器端,发送文件的一方是客户端。

  1. 服务器端命令:

    nc -l ip地址 端口号 > 接收的文件名
    
    1
  2. 客户端命令:

    nc ip地址 端口号 < 发送的文件名
    
    1

服务器端效果:

客户端效果:

注意:这里客户端发送一个文件叫 index.html,服务器端以文件名 xxx.html 来保存,也就是说服务器端保存接收的文件名时不一定要使用客户端发送的文件名。

根据上面的介绍,当我们需要调试我们自己的服务器或者客户端程序时,又不想自己开发相应的对端,我们就可以使用 nc 命令去模拟。

当然,nc 命令非常强大,其功能远非本节介绍的这些,读者如果有兴趣可以去 nc 的 man 手册上获取更多的信息。

上次更新: 2025/04/01, 20:53:14
5.5 lsof
5.7 curl

← 5.5 lsof 5.7 curl→

最近更新
01
第二章 关键字static及其不同用法
03-27
02
第一章 auto与类型推导
03-27
03
第四章 Lambda函数
03-27
更多文章>
Copyright © 2024-2025 沪ICP备2023015129号 张小方 版权所有
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式