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连接测试工具的更多相关文章

  1. [na][tools]tcp/udp连通性测试

    一 端口连通性测试意义 目的端可以使用nc来临时开一个端口,客户端用telnet来连接测试 测试网络端口可达性,确保给某些使用特定端口的app做链路连通性检测.使它们能够正常的运行起来. 二 测试方法 ...

  2. TCP/UDP网络性能测试工具 - Netperf (zz) ..网络测试工具

    在构建或管理一个网络系统时,我们更多的是关心网络的可用性,即网络是否连通,而对于其整体的性能往往考虑不多. 除了netperf以外.       还有很多其它的网络性能测试工具.       如db, ...

  3. [tools]tcp/udp连通性测试

    一 端口连通性测试意义 测试网络端口可达性,确保给某些使用特定端口的app做链路连通性检测.使它们能够正常的运行起来.   二 法1 使用newclient发包,彼端tcpdump抓包观察是否能收到包 ...

  4. linux内核参数调优,缓冲区调整,tcp/udp连接管理,保持,释放优化,gossary,terms

    changing a readonly file (linu single user mode)

  5. Python渗透测试工具合集

    摘自:http://www.freebuf.com/tools/94777.html 如果你热爱漏洞研究.逆向工程或者渗透测试,我强烈推荐你使用 Python 作为编程语言.它包含大量实用的库和工具, ...

  6. python渗透测试工具集合

    作者:一起学习Python 原文链接:https://zhuanlan.zhihu.com/p/21803985 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在进行漏洞研究. ...

  7. EMQ ---100万线连接测试说明

    注解 EMQ 2.0 消息服务器默认设置,允许最大客户端连接是512,因为大部分操作系统 ‘ulimit -n’ 限制为1024. EMQ 消息服务器1.1.3版本,连接压力测试到130万线,8核心/ ...

  8. SIM7600CE TCP/IP连接与PPP拨号上网 4G上网

    SIM7600CE联网测试分为两部分: 1.TCP/IP连接 2.PPP拨号上网 实验环境:ubuntu-meta 16.04 硬件:树莓派3B,SIM7600CE 上网卡:移动的NB-IOT物联网卡 ...

  9. tcp/udp高并发和高吐吞性能测试工具

    在编写一个网络服务的时候都比较关心这个服务能达到多少并发连接,而在这连接的基础上又能达到一个怎样的交互能力.编写服务已经是一件很花力气的事情,而还要去编写一个能够体现结果的测试工具就更加消耗工作时间. ...

  10. TCP/UDP简易通信

    TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的 ...

随机推荐

  1. JetPack Compose 入门还得是官方

    官方写的真不错! 和那些所谓"教程"比真的简单高效不罗嗦! 所以还得是官方! 使用 Jetpack Compose 更快地打造更出色的应用 https://developer.an ...

  2. tex基础

    Tex中输入空格以及换行 1. 使用\ 表示空格以及调整空格的大小quad空格    a \qquad b        两个m的宽度quad空格    a \quad b        一个m的宽度 ...

  3. sqlite3 一条语句替换全表某个字符字段中的某个字符串

    update not_match_files set policy_id_tms = replace(policy_id_tms, substr(policy_id_tms,instr(policy_ ...

  4. DataRow[]数组转换为DataTable

    DataRow[] drData=DataTable.Select("....."); DataTable dtNew=drData.CopyToDataTable(); 注:Da ...

  5. Maven-高级

    Mvaen 高级 1 导入其他工程 资源文件 先install到仓库里 然后根据组织名项目名版本号写在dependence里正常导入 <dependence> <groupId> ...

  6. scrcpy

    捕获配置 缩小尺寸 有时,以较低的清晰度镜像 Android 设备以提高性能很有用. 将宽度和高度限制为某个值(例如 1024): scrcpy --max-size 1024 scrcpy -m 1 ...

  7. 量化交易-可视化展示(grafana)

    先上图 简单的实现了一下,效果还好,可玩性强 大概部署mysql+grafana step 1: 服务器:阿里云,ucloud啥的随意,配置也不需要什么,我的是阿里云1核1GB,足以 我用的ubunt ...

  8. Delphi集合增删的另一种操作

    D7 1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Variants, Classes, Graphics, ...

  9. JSqlParser解析SQL时SUM包裹IF出错

    SQL SELECT SUM(IF(1=1,1,0)) AS `result` FROM sys_user 这种会报错的. 错误信息 Caused by: net.sf.jsqlparser.JSQL ...

  10. idea导入数据库

    yml文件(在启动项文件(main)里,eg:springbook文件里面) sh-bean里org.example.sh.beans的Category类   CategoryDAO名字要和Categ ...