首页 > 其他分享 >Golang使用kcp

Golang使用kcp

时间:2023-12-04 11:26:26浏览次数:36  
标签:nil err fmt 使用 Golang KCP kcpConn net kcp

安装 go get -u github.com/xtaci/kcp-go

import (
    "fmt"
    "github.com/xtaci/kcp-go"
    "golang.org/x/net/ipv4"
    "golang.org/x/net/ipv6"
    "net"
)
// KCP 服务器
func server() {
    // 创建一个 UDP 连接
    udpConn, err := net.ListenUDP("udp", &net.UDPAddr{Port: 12345})
    if err != nil {
        fmt.Println("创建UDP连接失败:", err)
        return
    }

    // 创建 KCP 对象
    kcpConn, err := kcp.ServeConn(nil, 0, 0, udpConn)
    if err != nil {
        fmt.Println("创建KCP连接失败:", err)
        return
    }

    // 设置 KCP 参数
    kcpConn.SetWindowSize(4096, 4096)
    kcpConn.SetNoDelay(1, 10, 2, 1)
    kcpConn.SetStreamMode(true)

    // 进行数据传输
    data := []byte("Hello, KCP!")
    _, err = kcpConn.Write(data)
    if err != nil {
        fmt.Println("数据传输失败:", err)
        return
    }

    // 关闭连接
    kcpConn.Close()
}

// KCP 客户端
func client() {
    // 创建一个 UDP 连接
    udpConn, err := net.DialUDP("udp", nil, &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 12345})
    if err != nil {
        fmt.Println("创建UDP连接失败:", err)
        return
    }

    // 创建 KCP 对象
    kcpConn, err := kcp.Dial(udpConn.RemoteAddr().String())
    if err != nil {
        fmt.Println("创建KCP连接失败:", err)
        return
    }

    // 设置 KCP 参数
    kcpConn.SetWindowSize(4096, 4096)
    kcpConn.SetNoDelay(1, 10, 2, 1)
    kcpConn.SetStreamMode(true)

    // 接收数据
    buffer := make([]byte, 1024)
    n, err := kcpConn.Read(buffer)
    if err != nil {
        fmt.Println("接收数据失败:", err)
        return
    }

    fmt.Println("接收到的数据:", string(buffer[:n]))

    // 关闭连接
    kcpConn.Close()
}

func main() {
    go server() // 启动 KCP 服务器
    go client() // 启动 KCP 客户端

    // 等待程序退出
    select {}
}

标签:nil,err,fmt,使用,Golang,KCP,kcpConn,net,kcp
From: https://www.cnblogs.com/qcy-blog/p/17874488.html

相关文章

  • notepad++中的正则表示式使用方法
    当使用Notepad+中的正则表达式时,可以利用以下常用的元字符和语法规则来构建你的表达式:正则表达式知识准备字符匹配:\d:匹配任意数字。\w:匹配任意字母、数字或下划线。\s:匹配任意空白字符(空格、制表符等)。.:匹配除换行符外的任意字符。重复次数:*:匹配前一个元素零次或......
  • 【让AI女友跟我表白】大白话说Python+Flask入门(四)Flask Sijax的使用
    写在前面先吐槽两句,搞个mysql安装配置弄了4个小时,怎么都是外网无法访问,我靠,我特么也是服了。当然,后来我投降了,明天再说,学什么不是学,娘的,换个方向,状态依然在!Sijax是什么?代表SimpleAjax,它是一个Python/jQuery库,使用jQuery.ajax来进行AJAX请求用的。安装依赖pipinstallflas......
  • hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法
    解决方案通过将别名.*换成{别名.*}hibernate会自动为我们生成别名,具体修改如下图: ......
  • Windows驱动中使用数字签名验证控制设备访问权限
    1.背景  在一般的驱动开发时,创建了符号链接后在应用层就可以访问打开我们的设备并进行通讯。  但我们有时候不希望非自己的进程访问我们的设备并进行交互,虽然可以使用IoCreateDeviceSecure来创建有安全描述符的设备,但大数的用户账户为了方便都是管理员,因此该方法不太完整......
  • .NET 7(C#)配置使用log4net日志框架的方法
    .NET7(C#)中配置和使用log4net日志框架是一个涉及多步骤的过程。log4net是一个高度灵活且强大的日志记录库,可用于记录应用程序的运行时信息。它支持各种日志输出格式和目的地,如文件、数据库、控制台等。以下是在.NET7(C#)项目中配置和使用log4net的基本步骤:1.安装log4net......
  • ubuntu22.04使用esp_idf
    因为需要安装这个开发工具,所以这里记录一下,主要是参考的这个网页:https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.4/esp32/get-started/index.html#esp-idf这里特别注意:这个过程需要下载很多东西,建议使用梯子,不然很容易失败,我本人是前两次没用梯子,都失败了,第三次......
  • C++中 enum 的使用
    C++中的枚举enum使用如果没有对应的范围限定,会很容易出现重定义的错误。如下的重定义错误,在一个文件中有如下两个枚举,编译时会出现重定义错误enumType{MIN_TYPE,MAX_TYPE,INPUT_TYPE};enumMode{CITY,INPUT_TYPE};此时虽然是不同的枚举类型,......
  • obs个人使用指南
    obs篇基本信息obs软件官网:https://obsproject.com/obs附属论坛:https://obsproject.com/forum/obs插件库:https://obsproject.com/forum/plugins/脚本使用指南(以autosplitter为例)首先我们在对应得脚本页面,获取下载链接类似脚本链接会直接打开github得源代码,我们直接......
  • 基于 visual studio 2022 环境下的“MFC”计算器登录使用
    一、前言1、系统环境:Window10,visualstudio2022,MYSQLClient(MariaDB5.5(X64))。2、界面:这是一个MFC界面,通过连接创建的数据库,实现计算器登录、运算以及查看历史记录的功能。二、设计过程1、流程图:2、数据库表格创建与连接(1)创建用户表“yunzhou”:(2)创建历史记录表“yu......
  • 文本编辑器(Vi)及使用方法
    可使用的文本编辑器:Emacs——著名的集成开发环境和文本编辑器,被公认为是最受专业程序员喜爱的代码编辑器之一,有着极强扩展性的编程语言,从而实现了包括编程、编译乃至网络浏览等等功能的扩展。Nano——一种被许多可启动Linux系统以及其他空间有限的Linux环境所使用的流行且简化......