PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : irc bot/client pong senden



echoslider
01.06.2009, 18:11
hi. ich habe einen code für nen irc clienten(c++) gefunden. und ich kann bei quakenet nicht senden weil ken PONG gesendet wird. wie und wo kann ich das einbauen?


#include <windows.h>
#include <iostream>
#include <string.h>
#include <winsock.h>
#include <process.h>

#pragma comment(lib, "ws2_32.lib")


void Zugangsdaten(std::string *zugangsdaten)
{
zugangsdaten[0] = "trans3";
zugangsdaten[1] = "irc.quakenet.org";
zugangsdaten[2] = "#victim";

}

unsigned int VerbindenAnServer(std::string server, int port)
{
SOCKET sock;
char serverip[20];
sockaddr_in addr;
WSADATA wsaData;

if(WSAStartup(MAKEWORD(2,0), &wsaData) != 0)
std::cout<<"WSA konnte nicht initialisiert werden.";

hostent *dns = gethostbyname(server.c_str());

sprintf(serverip, "%u.%u.%u.%u",
(unsigned char) dns->h_addr_list[0][0], (unsigned char) dns->h_addr_list[0][1],
(unsigned char) dns->h_addr_list[0][2], (unsigned char) dns->h_addr_list[0][3]);

addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(serverip);

sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == 0)
std::cout<<"Socket konnte nicht initialisiert werden";

if(connect(sock, (sockaddr *) &addr, sizeof(addr)) == -1)
std::cout<<"Verbindung konnte nicht hergestellt werden";

char temp[10000];
int x = recv(sock, temp, 10000, 0);
temp[x] = 0;
//std::cout<< temp;

return sock;
}

void AnmeldenAnServer(SOCKET sock, std::string *zugangsdaten)
{

std::string user = "USER ";

user += zugangsdaten[0];
user += ' ';
user += "localhost";
user += ' ';
user += zugangsdaten[1];
user += ' ';
user += zugangsdaten[0];
user += "\r\n";

std::string nick = "NICK ";

nick += zugangsdaten[0];
nick += "\r\n";

send(sock, nick.c_str(), nick.length(), 0);
send(sock, user.c_str(), user.length(), 0);

//strtok(dein_Satz,dein_Trenner);
char temp[10000];
int x = recv(sock, temp, 10000, 0);
temp[x] = 0;

//std::string id = strtok(temp,"PING :");
std::cout<< temp;


}

void InRaumGehen(SOCKET sock, std::string *zugangsdaten)
{
std::string join = "JOIN ";

join += zugangsdaten[2];
join += "\r\n";

send(sock, join.c_str(), join.length(), 0);


char temp[10000];
int x = recv(sock, temp, 10000, 0);
temp[x] = 0;
std::cout<< temp;
}

void NachrichtenEmpfangen(void *sock)
{
char ausgabe[1000];
int x = 0;

while(1)
{
x = recv((SOCKET)sock, ausgabe, 1000, 0);

if(x > 0)
{
ausgabe[x] = 0;
std::cout<< ausgabe << std::endl;
}
Sleep(10);
}
}

void NachrichtenSenden(SOCKET sock)
{
char temp[1000];
std::string eingabe;

while(1)
{
std::cin.getline(temp, 100, '\n');
eingabe = temp;
eingabe += "\r\n";

send(sock, eingabe.c_str(), eingabe.length(), 0);
}
}


int main()
{
SOCKET sock;
std::string zugangsdaten[3];

Zugangsdaten(zugangsdaten);

sock = VerbindenAnServer(zugangsdaten[1], 6667);

AnmeldenAnServer(sock, zugangsdaten);
InRaumGehen(sock, zugangsdaten);
_beginthread(NachrichtenEmpfangen, 0, (void *)sock);
NachrichtenSenden(sock);

std::cin.get();
WSACleanup();
return 0;
}

blackberry
01.06.2009, 18:41
Der Bot ist sehr schlecht geschrieben.
Im Grunde müsste dein auf PING warten hier rein:

AnmeldenAnServer(sock, zugangsdaten);
// PING <--> PONG
InRaumGehen(sock, zugangsdaten);

Da PING's aber jede Minute gesendet werden und der Client rausgeworfen wird wenn keine Antwort kommt.
Daher müsste selbiger Code auch in die NachrichtenEmpfangen-Funktion rein.