【问题标题】:I thought TCP sent packets in order? [closed]我以为TCP按顺序发送数据包? [关闭]
【发布时间】:2013-06-07 00:35:27
【问题描述】:

我在 IRC 机器人中发送以下内容:

bot->message("chanserv", "op #channel");
bot->raw("KICK #channel " + this->nick(args[0]) + " :RIPIP");
sleep(2000);  // even tried sleepin
bot->message("chanserv", "deop #channel");

我看到它通过套接字发送

PRIVMSG chanserv :op #channel
KICK #channel baduser :RIPIP
PRIVMSG chanserv :deop #channel
:hobana.freenode.net 482 username #channel :You're not a channel operator

但随后它会返回一个数据包,说明您不是操作员,然后是操作/解操作响应数据包。

【问题讨论】:

  • 请不要向多个语言标签发送垃圾邮件...
  • 听起来像是服务器的缓冲问题。
  • 我正在使用 hiphop 将 php 编译成 c++,然后将嵌入式 python 用于插件
  • 是否 bot->mesage 被缓冲而 bot->raw 未被缓冲?如果 TCP 数据包被 发送 乱序,我会非常感到惊讶,但即使它们是,只要数据以正确的顺序进入流,它就会来以相同的顺序输出。你检查过数据包嗅探器吗?
  • 自以为是,TCP“数据包”并不是真正的“发送”。 IP包是。也许不正常。并且被重新组装和重新排序以在接收端产生数据流。 AFAIK,您无法读取“乱序”TCP 流。你确定你在这里使用的是 TCP 而不是 UDP?

标签: php c++ python tcp irc


【解决方案1】:

这与 TCP 没有任何关系——它与 IRC 的架构有关。 ChanServ 服务通常不是您要连接的客户端 ircd 的一部分。相反,它是由链接到客户端 ircd(s) 的单独 ircd 实现的。

这意味着您的KICK(来自您的客户端)可以在操作您(来自服务守护程序)的模式更改消息到达之前到达您的客户端服务器。

要正确执行此操作,您需要向ChanServ 发出op 命令,然后等到看到MODE 命令为您提供操作,然后再发出KICKdeop 命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2021-11-29
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多