lesismal / nbio

Pure Go 1000k+ connections solution, support tls/http1.x/websocket and basically compatible with net/http, with high-performance and low memory cost, non-blocking, event-driven, easy-to-use.
MIT License
2.17k stars 153 forks source link

请问多个包合并读取应该如何处理? #395

Closed joyanhui closed 8 months ago

joyanhui commented 8 months ago

在esp32单片机上发送消息到nbio的tcp server的时候,有tcp mss的1440的限制,超过1440字节后会拆分成多个DAT包。

在nbio这边应该如何处理呢。我根据nbio-examples 试了下 在客户端发送了一个1440 + 一个100 字节的两个包的情况徐敖 为什么for会循环几百上千次

package main

import (
    "fmt"
    "log"
    "github.com/lesismal/nbio"
)

func main() {
    g := nbio.NewGopher(nbio.Config{
        Network: "tcp",
        Addrs:   []string{":18007"},
        //EpollMod: nbio.EPOLLET,
    })

    g.OnRead(func(c *nbio.Conn) {
        buf := make([]byte, 512)
        clientInfo := []byte{}
        i := 0
        iErr := 0
        for {
            i++
            n, err := c.Read(buf[0:])
            if n > 0 {
                clientInfo = append(clientInfo, buf[0:n]...)
                if clientInfo[len(clientInfo)-1] == '#' {
                    c.Close()
                    break
                }
            }
            if err != nil {
                iErr++
                log.Println(err)
            }
        }
        log.Println("循环了", i, "次")
        log.Println("读取错误", iErr, "次")
        log.Println(string(clientInfo))

    })
    err := g.Start()
    if err != nil {
        fmt.Printf("nbio.Start failed: %v\n", err)
        return
    }

    g.Wait()
}
2024/02/08 18:40:21 resource temporarily unavailable
2024/02/08 18:40:21 resource temporarily unavailable
2024/02/08 18:40:21 resource temporarily unavailable
2024/02/08 18:40:21 resource temporarily unavailable
2024/02/08 18:40:21 resource temporarily unavailable
2024/02/08 18:40:21 resource temporarily unavailable
2024/02/08 18:40:21 循环了 458 次
2024/02/08 18:40:21 读取错误 454 次
2024/02/08 18:40:21 v1Set!xl:4827e25702c4!16!0a484b5c79ddb3c933c67a97194501a1!760532712!Sr5sLSyfjqUR8LBp0DHM6HfnYDLR09vmxwLNlM_fn7fa6Psm-4vWjEvooi6OsT5b8a_k7w-wOuGB2PHPUPMse2zj9YxYOyEDQejFDf_ESqe3ESDa_evh8rnZWF7j3jsYjB-BsCF1jWS41M2UI7UjDX_3QZGZ9EScMmMOZykAkWN8AJUbjsEbc_gofOmxjAabmSvKcHh1zhK3IQcomP3s5oBj2T32oV098jR3IqZsPkaAOcvr-LHSETaTmwKmjd-Qb00haPiuuTWxVqm0gPJ3nz-JzWTh8_9H8Jv9IMWbH0mh2T-KuzcHFGevPGqNM-5GdGo4iISCkx10Sekj1TDb1YHyS6G1A6MZCWHcjml5iQ0Ull-Wynp1EOqZHInbOl0h4JDEyFEk4UAGGr705_FwB_6R6WRJd1Ma6UFfP2HtbU0BsMoHLcTlhdsuURRdHY33KAJCD4pdduuGKeCqtRVLFa4furAjbsqnvivg44FIVyxDmxFSKf9SkgMJ3OiwpVn9bWTiuKlJu1ezb5L68JkNGcOEf94hC34XKCBI6uTA0pKZg6bTAru5ZknCa3-PeSmJAP7mznL3lLPinMIEhuoF0y09qGTVIIleM9wCsmZHa5Gdw8YndeVzlHKA9BBO5GMMuUFMBH4bbCj0onuiJ7vlYxO7PMQF-pEIk0TcZyjL__XqhAA07xg-L-xF4tfvHI-MBgJNrfjCPayIfYsjxtQ23V5uXhfoAeluzZNxPjr3f857VPxagTU4VgAUlZYC7qH0LqoKHsngAnEV38QIOFC4H3T3KOykT-Vf-z8xbZQ2u-0h2GAb4h1blmg9li9zmRXhoE88q9_H8PUP3d1CklPtP6Mqi0b2f3GPM9YqSAvEF-IfZ4nepn9dRmKg18Wnz8IC0_7gaOXX_C-OcSuR60Qk9WwRw0pyjig75VwY6ZFQ0MyuGM_1T8nIeIt84Ks272LWFHpIPt7s9uFcM0AtGbeg_SK4NkjRg6F1DrXKLqtFXZfszK19_WWvG2bEpsByvmjcuu_4Sye6OxBgpkyS1yxMsBQKCwoa4kaPtdXCxFHBLT6wLw4uS11Ym_Z5d36X035j6v5W9l9dst5hzsnUq1C2ZOLAuptiKkRTt-O-jzZTPGaJc-K79xtT8dyUn0CuRylRCbl1XFCSu2ZgEeebpJ8s-zEiNA3wZq9ZsEMQsNmD_433XUY4FAdQTFRAD-iQvFcUuKb2yhJ4zu1diw_pIstvrOZy04CNdxLtKswNYFN3CaiGVU-egu_r-Ao-SIUXgFi-G7ARsnNBpUKeL3NXjcStEa_b-ldZrzSZc2fTca_kH7CykR47q-x-pAVj9CxCMMZK10i1rCeHyMWqfWRFmKmztb9kW8xI0x7aUZwLosHs52ljg8dvwHyZQGEU2rYNehGvbvaz1M-Y1qaRZIym9w9M-qlmQc7ymnIjr3TKBDpq8UcoNT6wQj12l5TdcrtmzOWX#
lesismal commented 8 months ago

可以直接使用 OnData ,nbio会传data给你,但这个data是用poller上公共的buffer进行读取,所以如果你在OnData注册的handler之外仍然要使用传递给你的data需要自己另行拷贝

如果一定要自己定制OnRead,可以参考下nbio的默认实现: https://github.com/lesismal/nbio/blob/master/poller_epoll.go#L199

resource temporarily unavailableEAGAIN,说明当前没有数据可读,这时候你应该结束本次读取、等待下次可读再读

joyanhui commented 8 months ago

@lesismal 大佬春节快乐,感谢!

lesismal commented 8 months ago

新年快乐🚀