Winsock + irc = niewiadomy problem

Odpowiedz Nowy wątek
2011-08-28 14:34
0

Witam! Chce napisac program dla kolegi, bedzie mial za zadanie podlaczyc sie do serwera irc, odpowiedniego kanalu oraz wyszukac osobe chetna do gry - to tak z grubsza. Serwer do ktorego sie laczy to irc.quakenet.org, port 6667, kanal #cw.pl. Najpierw nauczylem sie laczyc telnetem, tutaj napisze kolejne polecenia:
o
irc.quakenet.org 6667
NICK arasso12
(serwer wysyla ping)
PONG :XXXXXXXXXX
USER arasso12 8 * :Fajny
W tym momencie podlaczam sie, pozniej
JOIN #cw.pl i byloby na tyle, ale... identycznie dzialajacy program nie moze sobie z tym poradzic ;/

int main()
{
 
    SOCKET        sClient;
    WSADATA       wsd;
 
    sockaddr_in server;
    hostent    *host = NULL;
    char    szServer[128]="irc.quakenet.org";
    int     iPort     = 6667;
 
    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
    {
        cout << "Fejl 1." << endl;
        return 1;
    }
 
    sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sClient == INVALID_SOCKET)
    {
        cout << "Nie mozna utworzyc gniazda (" << WSAGetLastError() << ")." << endl;
        return 1;
    }
    server.sin_family = AF_INET;
    server.sin_port = htons((u_short)iPort);
    server.sin_addr.s_addr = inet_addr(szServer);
 
    if (server.sin_addr.s_addr == INADDR_NONE)
    {
        host = gethostbyname(szServer);
        if (host == NULL)
        {
            cout << "Nie mozna przeksztalcic na ip: " << szServer << endl;
            return 1;
        }
        CopyMemory(&server.sin_addr, host->h_addr_list[0], host->h_length);
    }
 
    if (connect(sClient, (sockaddr *)&server,
        sizeof(server)) == SOCKET_ERROR)
    {
        cout << "Nie mozna sie polaczyc (" << WSAGetLastError() << ")." << endl;
        return 1;
    }
    cout << "Polaczono." << endl<<endl;
 
    char buffer[512], suffix[512];
    recv(sClient, buffer, sizeof buffer, 0);
    recv(sClient, buffer, sizeof buffer, 0);
 
    memset(buffer, 0, sizeof buffer);
    sprintf(buffer, "NICK arasso12\r\n");
    cout<<buffer<<endl;
    send(sClient, buffer, strlen(buffer), 0);
 
    memset(buffer, 0, sizeof buffer);
    while(sscanf(buffer, "PING :%s", suffix)<0)
    {
        memset(buffer, 0, sizeof buffer);
        recv(sClient, buffer, sizeof buffer, 0);
 
    };
 
    cout<<suffix;
    memset(buffer, 0, sizeof buffer);
    sprintf(buffer, "PONG :%s\r\n", suffix);
    cout<<buffer<<endl;
    send(sClient, buffer, strlen(buffer), 0);
 
    memset(buffer, 0, sizeof buffer);
    sprintf(buffer, "USER arasso12 8 * :Acvs\r\n");
    cout<<buffer<<endl;
    send(sClient, buffer, strlen(buffer), 0);
    memset(buffer, 0, sizeof buffer);
 
    send(sClient, "JOIN #cw.pl", strlen("JOIN #cw.pl"), 0);
 
    cin>>buffer; return 0;}

Nie rozumiem w czym problem, fakt winsock nie ogarniam jeszcze na poziomie zadowalajacym ale jakos sobie radze z pomoca google... Prosze o rady, pozdro :)


non omnis moriar i tyle :-)

Pozostało 580 znaków

2011-08-28 14:43
0

Nie napisałeś, w czym jest problem.
Nie dostajesz odpowiedzi?


Pozostało 580 znaków

2011-08-28 14:47
0

DRY kolego. Poprawnie zastosujesz tą zasadę i zrezygnujesz z programowania jednofunkcyjnego to problem zlikwiduje się sam.
Nie wysyłasz \r\n po JOINie, w dodatku stringi powtarzają ci się parę razy...


Women were the reason I became a monk - and, ah, the reason I switched back...
edytowany 1x, ostatnio: Demonical Monk, 2011-08-28 14:49

Pozostało 580 znaków

2011-08-28 14:48
0

Problem jest w tym ze program dziala prawidlowo do momentu gdzie otrzymuje PING dalej (chyba) wysyla poprawne dane, bo raczej nie ma innej opcji ale najwyrazniej polecenie USER nie dziala i po jakims czasie dostaje NO IDENT RESPONSE czy jakos tak. Reasumujac po tych dzialaniach program powienien sie zalogowac na kanal a tego nie robi ;/

@Demonical Monk
To nie jest finalna wersja programu, tylko samo laczenie sie do serwera i kanalu co juz mi nie wychodzi...

EDIT
racja, zapomnialem o \r\n ale to i tak nie mialo znaczenia bo po USER serwer powinien wysylac mase informacji a tego nie robi(sprawdzalem), po dodaniu \r\n dalej to samo...

EDIT
Problem rozwiazany:
memset(buffer, 0, sizeof buffer);
sprintf(buffer, "USER %s \"\" \"\" :%s\r\n", "arasso12", "Abc");
send(sClient, buffer, strlen(buffer), 0);

Pozdro ; )


non omnis moriar i tyle :-)
edytowany 3x, ostatnio: arasso12, 2011-08-29 11:13

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0