Skip to content

建议优化hio_set_peeraddr多线程安全问题 #707

@House-Men

Description

@House-Men

当协议为UDP/KCP/IP并且非io回调线程内执行hio_set_peeraddr设置发送目标之后执行hio_write触发sendto固定使用io->peeraddr地址信息 存在因loop线程不同来源或端口的接收事件触发__nio_read->recvfrom接收篡改io->peeraddr导致hio_write->sendto实际发送目标错误

或许可以考虑增加 io->writeaddr成员与hio_set_writeaddr方法 使其和 recvfrom使用的io->peeraddr区分开 不过这样调用者任需要注意set和write两个方法之间要同步。
或者增加参数hio_write(... addr DEFAULT(NULL) ) 如果不为NULL时则nio_write使用此参数地址发送 try_write 失败将地址信息携带投递到write_queue队列排队发送
亦或者hio_write特性保持不变增加一个新方法hio_sendto专门用于地址信息栈传参安全发送指定目标的非TCP协议报文
当然具体如何做或有没更好的方案就看作者如何考虑了

另外cpp封装的UdpClient/UdpServer的sendto方法因为也是先hio_set_peeraddr后hio_write存在相同的问题

#523 这个issues应该就是遇到类似的现象 虽然使用定时器或runInLoop可以保障回调到io线程执行从而规避 但这存在额外的消耗且与函数描述thread safe以及tcp模式可安全直接hio_write调用行为不匹配 而且如果触发try_write失败进入队列依然可能造成peeraddr错乱

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions