C++ 连接到IRC服务器,获取Ping超时而不接收Ping消息

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

我第一次尝试网络编程,使用SFML网络功能实现一个小型IRC机器人

联系建立起来了,但从那以后我不能做更多的事情。尝试从服务器接收任何数据都不会产生任何结果,直到几秒钟后收到“Ping timeout”消息

删除
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”结尾