go简易tcp/udp连接测试工具
package main import (
"fmt"
"io"
"log"
"net"
"os"
) func showBytes(bytes []byte) string {
var str []byte
for _, b := range bytes {
if b >= 33 && b <= 126 && b != 92 {
str = append(str, b)
} else {
str = append(str, fmt.Sprintf("\\%02X", b)...)
}
}
return string(str)
} func writeAllTCP(con *net.TCPConn, message []byte) error {
defer con.CloseWrite()
for len(message) > 0 {
l, err := con.Write(message)
if err != nil {
return err
}
message = message[l:]
}
return nil
} func handleTCP(client *net.TCPConn, message []byte) {
defer client.Close()
addrStr := client.RemoteAddr().String()
log.Printf("Client %s connected\n", addrStr)
var data [1024]byte
n, err := io.ReadFull(client, data[:])
if err != nil && err != io.ErrUnexpectedEOF {
log.Printf("Failed to read: %v\n", err)
return
}
log.Printf("From %s: %s\n", addrStr, showBytes(data[:n]))
if err := writeAllTCP(client, message); err != nil {
log.Printf("Failed to write: %v\n", err)
return
}
} func main() {
if len(os.Args) != 5 || os.Args[1] != "tcp" && os.Args[1] != "udp" || os.Args[2] != "server" && os.Args[2] != "client" {
fmt.Fprintf(os.Stderr, "Usage: %s tcp|udp server|client <server address> <message>\n", os.Args[0])
os.Exit(1)
}
if os.Args[1] == "tcp" {
addr, err := net.ResolveTCPAddr("tcp", os.Args[3])
if err != nil {
panic(err)
}
if os.Args[2] == "server" {
con, err := net.ListenTCP("tcp", addr)
if err != nil {
panic(err)
}
defer con.Close()
for {
client, err := con.AcceptTCP()
if err != nil {
log.Printf("Failed to accept: %v\n", err)
continue
}
go handleTCP(client, []byte(os.Args[4]))
}
} else {
con, err := net.DialTCP("tcp", nil, addr)
if err != nil {
panic(err)
}
defer con.Close()
if err := writeAllTCP(con, []byte(os.Args[4])); err != nil {
panic(err)
}
var data [1024]byte
n, err := io.ReadFull(con, data[:])
if err != nil && err != io.ErrUnexpectedEOF {
panic(err)
}
fmt.Println(showBytes(data[:n]))
}
} else {
addr, err := net.ResolveUDPAddr("udp", os.Args[3])
if err != nil {
panic(err)
}
if os.Args[2] == "server" {
con, err := net.ListenUDP("udp", addr)
if err != nil {
panic(err)
}
defer con.Close()
for {
var data [1024]byte
n, addr, err := con.ReadFromUDP(data[:])
if err != nil {
log.Printf("Failed to read: %v\n", err)
continue
}
log.Printf("From %v: %s\n", addr, showBytes(data[:n]))
_, err = con.WriteTo([]byte(os.Args[4]), addr)
if err != nil {
log.Printf("Failed to write: %v\n", err)
continue
}
}
} else {
con, err := net.DialUDP("udp", nil, addr)
if err != nil {
panic(err)
}
defer con.Close()
_, err = con.Write([]byte(os.Args[4]))
if err != nil {
panic(err)
}
var data [1024]byte
n, _, err := con.ReadFromUDP(data[:])
if err != nil {
panic(err)
}
fmt.Println(showBytes(data[:n]))
}
}
}
https://gitee.com/thhh_sunny/go-net-hello?_from=gitee_search
https://gitee.com/YePitfall/socket-programming/tree/master/udpclient
go简易tcp/udp连接测试工具的更多相关文章
- [na][tools]tcp/udp连通性测试
一 端口连通性测试意义 目的端可以使用nc来临时开一个端口,客户端用telnet来连接测试 测试网络端口可达性,确保给某些使用特定端口的app做链路连通性检测.使它们能够正常的运行起来. 二 测试方法 ...
- TCP/UDP网络性能测试工具 - Netperf (zz) ..网络测试工具
在构建或管理一个网络系统时,我们更多的是关心网络的可用性,即网络是否连通,而对于其整体的性能往往考虑不多. 除了netperf以外. 还有很多其它的网络性能测试工具. 如db, ...
- [tools]tcp/udp连通性测试
一 端口连通性测试意义 测试网络端口可达性,确保给某些使用特定端口的app做链路连通性检测.使它们能够正常的运行起来. 二 法1 使用newclient发包,彼端tcpdump抓包观察是否能收到包 ...
- linux内核参数调优,缓冲区调整,tcp/udp连接管理,保持,释放优化,gossary,terms
changing a readonly file (linu single user mode)
- Python渗透测试工具合集
摘自:http://www.freebuf.com/tools/94777.html 如果你热爱漏洞研究.逆向工程或者渗透测试,我强烈推荐你使用 Python 作为编程语言.它包含大量实用的库和工具, ...
- python渗透测试工具集合
作者:一起学习Python 原文链接:https://zhuanlan.zhihu.com/p/21803985 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在进行漏洞研究. ...
- EMQ ---100万线连接测试说明
注解 EMQ 2.0 消息服务器默认设置,允许最大客户端连接是512,因为大部分操作系统 ‘ulimit -n’ 限制为1024. EMQ 消息服务器1.1.3版本,连接压力测试到130万线,8核心/ ...
- SIM7600CE TCP/IP连接与PPP拨号上网 4G上网
SIM7600CE联网测试分为两部分: 1.TCP/IP连接 2.PPP拨号上网 实验环境:ubuntu-meta 16.04 硬件:树莓派3B,SIM7600CE 上网卡:移动的NB-IOT物联网卡 ...
- tcp/udp高并发和高吐吞性能测试工具
在编写一个网络服务的时候都比较关心这个服务能达到多少并发连接,而在这连接的基础上又能达到一个怎样的交互能力.编写服务已经是一件很花力气的事情,而还要去编写一个能够体现结果的测试工具就更加消耗工作时间. ...
- TCP/UDP简易通信
TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的 ...
随机推荐
- 【python】绘图坐标轴标题中包含上标或下标
plt.ylabel("流量($\mathregular{m^3}$/s)") #绘图坐标轴添加上标$\mathregular{m^3}$,若是下标m_3 不加m ...
- vue项目中axios跨域设置
最近项目中遇到一个问题,测试环境和线上环境需要调同一个接口(接口地址是线上的),本地开发的时候遇到了跨域的问题,刚开始用了fetch解决的,代码如下 方法一 step1:安装包node-fetch,然 ...
- Java中finalize()方法的使用
参考:https://blog.csdn.net/m0_64624615/article/details/126326921 垃圾回收器
- SQL Sever ——基础篇之数据库的基本操作
数据库定义:对数据进行存储喝管理 数据库的系统模型:层次型,网状型,关系型(主流)和对象关系型. 关系型:Realation model 关系-->行列交叉.形式:表示实体和实体间相互联系的数据 ...
- docker安装常用软件
linux安装docker 1.安装gcc相关 yum install gcc -y yum install gcc-c++ -y 2.安装工具包 #安装工具包 yum -y install yum- ...
- 异常(Java)
异常 基本介绍 什么是异常? 在实际工作中,遇到的情况不可能是非常完美.比如:你写的某个模块,用户输入不一定符合你的要求.你的程序要打开某个文件,这个文件可能不存在或者文件格式不对 软件程序在运行过程 ...
- 学习Java的第一个代码
HelloWorld 新建一个文件夹 新建一个Java 文件后缀为java hello.java 编写代码 public class hello{ public static void main(St ...
- DBEditEh/Edit 文本框内容空白时加上提示文字,输入内容时提示文字不显示
当文本框没有输入内容且输入焦点不在文本框时,显示提示文字:"请输入帐号"当文本框得到输入焦点时提示文字不显示 unit SkinHintEdit; interface uses W ...
- 12、jmeter逻辑控制器-临界区控制器
临界区:说白了就是不并发了 一个个的像独木桥 使用场景:比如提交一个数据 需要一个一个的提交 一个个的改 在数据库改操作的时候 需要用到 临界区控制器 案例:临界区控制器
- Docker 修改容器中的mysql密码
1.查看容器服务 docker ps2.进入mysql容器 docker exec -it mysql /bin/bash 注:mysql为容器的名字 3.登录MySQL mysql -u root ...