-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Closed
Description
当协议为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错乱
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels