Winsock + irc = niewiadomy problem

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 :)

0

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

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...

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 ; )

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