WinSocket IRC USER命令
问题描述:
当我通过telnet连接到IRC服务器时,一切正常,但在我的程序中,在问候消息后没有来自服务器的响应。怎么了?WinSocket IRC USER命令
PS当我发送“JOIN #channel”服务器响应。
片段代码:
while (true)
{
ret = recv(pocket, buf, 512, 0);
if (ret == 0 || ret == SOCKET_ERROR)
{
printf("Serwer przerwal polaczenie");
break;
}
buf[ret] = '\0';
input = buf;
printf("%s\n", input.c_str());
if (fTime)
{
isend(pocket, "USER foox 0 0 :foox");
isend(pocket, "NICK foobar");
fTime = false;
}
memset(buf, 0, sizeof(buf));
}
isend功能:
bool isend(SOCKET socket,std::string message)
{
int ret = send(socket, message.c_str(), message.size() + 1, 0);
if (!ret){
printf("Nie udalo sie wyslac pakietu: \"%s\"", message);
return false;
}
else
return true;
}
答
不要在连接读取。根据RFC 2812发送NICK和USER信息。您按照建议的相反顺序执行此操作。 NICK和USER行都需要用\ r \ n正确终止,然后才能阅读。
不发送message.size()+ 1 - 发送message.size()。我不明白你为什么要发送message.size()+ 1,而你在我的评论中没有回答为什么。
如果您遇到困难,建议使用Wireshark之类的未加密连接并记录IRC客户端如何管理它。
答
你有三个问题:
你做阻塞读取,这将永远等待,如果没有什么阅读。
您需要在每行之后发送回车符和换行符。
你不想发送终止零字节。
你为什么要发送.size()+ 1?对于USER和NICK,它看起来并不像在每行之后发送\ r \ n。 – Boofhead
我之前纠正过它,但它仍然不起作用 – user3434747
看起来您的编辑仍然发送发送size()+ 1的错误。你再次没有添加\ r \ n到每个。根据RFC,每行应该被正确终止。 – Boofhead