C++ 连接到IRC服务器,获取Ping超时而不接收Ping消息
我第一次尝试网络编程,使用SFML网络功能实现一个小型IRC机器人 联系建立起来了,但从那以后我不能做更多的事情。尝试从服务器接收任何数据都不会产生任何结果,直到几秒钟后收到“Ping timeout”消息 删除C++ 连接到IRC服务器,获取Ping超时而不接收Ping消息,c++,network-programming,sfml,irc,C++,Network Programming,Sfml,Irc,我第一次尝试网络编程,使用SFML网络功能实现一个小型IRC机器人 联系建立起来了,但从那以后我不能做更多的事情。尝试从服务器接收任何数据都不会产生任何结果,直到几秒钟后收到“Ping timeout”消息 删除loginOnIRC函数中的所有或部分receive()调用没有任何好处 尝试使用完全相同的消息通过telnet进行连接。在这里,我得到了一个PING消息后,发送我的尼克消息 我错过什么了吗 我的代码如下 #include <iostream> #include <st
loginOnIRC
函数中的所有或部分receive()
调用没有任何好处
尝试使用完全相同的消息通过telnet进行连接。在这里,我得到了一个PING消息后,发送我的尼克消息
我错过什么了吗
我的代码如下
#include <iostream>
#include <string>
#include <SFML/Network.hpp>
#define ARRAY_LEN(x) (sizeof(x)/sizeof(*x))
void receive(sf::TcpSocket* sck)
{
char rcvData[100];
memset(rcvData, 0, ARRAY_LEN(rcvData));
std::size_t received;
if (sck->receive(rcvData, ARRAY_LEN(rcvData), received) != sf::Socket::Done)
{
std::cout << "oops" << std::endl;
}
std::cout << "Received " << received << " bytes" << std::endl;
std::cout << rcvData << std::endl;
}
int establishConnection(sf::TcpSocket* sck)
{
sf::Socket::Status status = sck->connect("irc.euirc.net", 6667, sf::seconds(5.0f));
if (status != sf::Socket::Done)
{
std::cout << "Error on connect!" << std::endl;
return 1;
}
std::cout << "Connect was successful!" << std::endl;
return 0;
}
int loginOnIRC(sf::TcpSocket* sck)
{
receive(sck); // We get a Ping timeout here
std::string data{ "NICK NimBot" };
if(sck->send(data.c_str(), data.length()) != sf::Socket::Done)
{
std::cout << "Error on sending " << data << std::endl;
return 1;
}
receive(sck);
data = "USER NimBot * * :Nimelrians Bot";
if (sck->send(data.c_str(), data.length()) != sf::Socket::Done)
{
std::cout << "Error on sending " << data << std::endl;
return 1;
}
receive(sck);
data = "JOIN #nimbottest";
if (sck->send(data.c_str(), data.length()) != sf::Socket::Done)
{
std::cout << "Error on sending " << data << std::endl;
return 1;
}
return 0;
}
int main()
{
sf::TcpSocket sck{};
establishConnection(&sck); // works
loginOnIRC(&sck);
while(true)
{
char data[100];
memset(data, 0, ARRAY_LEN(data));
std::size_t received;
sf::Socket::Status rcvStatus = sck.receive(data, ARRAY_LEN(data), received);
if (rcvStatus != sf::Socket::Done)
{
std::cout << "oops" << std::endl;
if (rcvStatus == sf::Socket::Disconnected)
{
break;
}
}
std::cout << "Received " << received << " bytes" << std::endl;
std::cout << data << std::endl;
}
return 0;
}
#包括
#包括
#包括
#定义数组长度(x)(sizeof(x)/sizeof(*x))
无效接收(sf::TcpSocket*sck)
{
字符rcvData[100];
memset(rcvData,0,ARRAY_LEN(rcvData));
标准:收到的尺寸;
如果(sck->receive(rcvData,ARRAY_LEN(rcvData),received)!=sf::Socket::Done)
{
std::难道我本以为IRC命令的末尾需要换行符。非常感谢,我错过了RFC中的这一部分。您似乎希望在发送任何内容之前收到。此外,IIRC发送到IRC服务器的第一条消息应该是PASS,无论它是否需要密码。所有命令都应以:“\r\n”结尾
。