Autor Wątek: [WINSOCK] IRC bot  (Przeczytany 935 razy)

Offline Charie

  • Użytkownik

# Czerwiec 26, 2010, 22:55:04
Witam!
Robię i robię mojego IRC bota...
w c++

Postawiłem sobie takie zadanie, wiem, że prościej w pythonie/php/python, ale takie sobie zadanie postawiłem .
Otóż ciągle otrzymuje no ident response
aż program się "zawiesza" ( tak jakby czekał na niego ), aż dostaję timed out i do widzenia, czym to może być spowodowane ?

Oto mój kod, jeżeli ktoś mógłby zerknąć :-)

#include <iostream>
#include <winsock2.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

        const int MAX_TAB=1024*8;
        WSADATA                wsaData;
        SOCKADDR_IN        saddr;
        SOCKET                sock;
        char                buffer[MAX_TAB] = {"0"};
        string                adres_hosta = "irc.quakenet.org";
        string                sbuffer;
        string                nick = "miniBOT";
        string                kanal = "#hack.edu.pl";

u_long resolveHost(const string &host)
{
        LPHOSTENT entryHost = gethostbyname(host.c_str());

        if(!entryHost)
        {
                unsigned int addr = inet_addr(host.c_str());

                entryHost = gethostbyaddr((char*)&addr, 4, AF_INET);

                if(!entryHost)
                        return 0;
        }
        return *((int*)*entryHost->h_addr_list);
}

int main()
{

        cout<<"Dawaj dawaj nie przestawaj\n";

        WSAStartup(MAKEWORD(2, 2), &wsaData);

        sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

        saddr.sin_addr.S_un.S_addr = resolveHost(adres_hosta);
        saddr.sin_port =  htons(6667);
        saddr.sin_family = AF_INET;

        if(connect(sock, (sockaddr*)&saddr, sizeof(sockaddr)) == SOCKET_ERROR)
        {
                cout << "Cos sie nie powiodlo, nie mozna sie polaczyc";
                return 0;
        }

        Sleep(100);

        recv(sock, buffer,MAX_TAB, 0);

        cout << buffer << endl << endl;


        sbuffer = "NICK ";
        sbuffer += nick;
        sbuffer +="\r\n";

        send(sock, sbuffer.c_str(), strlen(sbuffer.c_str()), 0);
        recv(sock, buffer, MAX_TAB, 0);
        cout << sbuffer.c_str() << endl << buffer << endl << endl;

        sbuffer = "USER ";
        sbuffer +=nick;
        sbuffer+=" . . : ";
        sbuffer+=nick;
        sbuffer+="\r\n";
        send(sock, sbuffer.c_str(), strlen(sbuffer.c_str()), 0);
        recv(sock, buffer, MAX_TAB, 0);

        cout << endl << buffer << endl <<"JEST ?\n";

while(true)
{
    Sleep(20);
    recv(sock, buffer, 256, 0);
    cout << buffer << endl << endl;

            char *tmp1 =strstr(buffer,"PING");
            char *tmp2=strstr(buffer,"MODE miniBOT +i");
            if(tmp1==NULL){
            cout<<"NIC ZNOWU NIC\n";continue;}
            if(tmp1!=NULL)
            {
                cout<<"tmp1 wypala\n";
                buffer[1]='O';
                send(sock,buffer,MAX_TAB,0);
                continue;
            }
        else if(tmp2!=NULL)
        {
        cout<<"tmp2 wypala\n";
        sbuffer = "JOIN ";
        sbuffer += kanal;
        sbuffer +="\r\n";
        send(sock, sbuffer.c_str(), strlen(sbuffer.c_str()), 0);
        recv(sock, buffer, MAX_TAB, 0);

        cout << sbuffer.c_str() << endl << buffer << endl << endl;
        continue;

}

}

 WSACleanup();
}

Z góry dzięki za wszelką pomoc

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xion

  • Redaktor
    • xion.log

# Czerwiec 26, 2010, 23:28:38
Niektóre serwery IRC wymagają, by ich klienci mieli serwery Ident. Niekiedy bez tego nie pozwalają się połączyć. Więcej szczegółów na ten temat np. tutaj: http://en.wikipedia.org/wiki/Ident .

Offline Charie

  • Użytkownik

# Czerwiec 28, 2010, 01:45:53
Sprawę jakoś rozwiązałem, przeprawiłem kod i działa :)
Tylko jest następny problem :
gdy ktoś wysyła mi wiadomość, a bot ma mi na nią odpowiedzieć to po kilku odpowiedziach wywala go z chata z przyczyną Flood Excess...
Jak się przed tym zabezpieczyć ???

Offline James

  • Użytkownik

# Czerwiec 28, 2010, 04:43:17
po prostu wysyłasz odpowiedzi za szybko, to zabezpieczenie przed floodowaniem