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

时间:2015-06-11 21:56:19

标签: c++ network-programming sfml irc

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

连接已建立,但从那时起我无法做其他事情。尝试从服务器接收任何数据都不会产生任何结果,直到几秒钟后我收到“Ping超时”消息。

删除receive()功能中的所有或部分loginOnIRC来电都没有用。

尝试通过telnet连接完全相同的消息。在发送我的NICK消息后,我立即收到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;
}

0 个答案:

没有答案