C
wenns ums conecten geht.. bitte:
cmIRC.cpp :
// cmIRC.cpp : Defines the entry point for the DLL application.
//
#define CM_IRC_DLL
#include <winsock2.h>
#include "cmIRC.h"
#include <vector>
#include <process.h>
using namespace std;
cmMSGPROC lCallback = NULL;
SOCKET s;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
int startWinsock(void)
{
WSADATA wsa;
return WSAStartup(MAKEWORD(2,0),&wsa);
}
long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
{
long rc;
unsigned long ip;
HOSTENT* he;
/* Parameter prüfen */
if(hostnameOrIp==NULL || addr==NULL)
return SOCKET_ERROR;
/* eine IP in hostnameOrIp ? */
ip=inet_addr(hostnameOrIp);
/* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */
if(ip!=INADDR_NONE)
{
addr->sin_addr.s_addr=ip;
return 0;
}
else
{
/* Hostname in hostnameOrIp auflösen */
he=gethostbyname(hostnameOrIp);
if(he==NULL)
{
return SOCKET_ERROR;
}
else
{
/*die 4 Bytes der IP von he nach addr kopieren */
memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
}
return 0;
}
}
unsigned int __stdcall RecThread(LPVOID)
{
char buf[256];
string rec_str;
long rc=0;
while(rc!=SOCKET_ERROR)
{
rc=recv(s,buf,256,0);
buf[rc]='\0';
rec_str = buf;
int ip = rec_str.find("PING");
if(ip != -1)
{
string pong = rec_str.substr(ip,rec_str.size());
char buf1[512];
sprintf(buf1,"PONG %s\r\n",pong.c_str());
send(s,buf1,strlen(buf),0);
}
char *token;
char seps[] = "\r\n";
token = strtok( buf, seps );
while( token != NULL )
{
lCallback(token);
token = strtok( NULL, seps );
}
}
return 0;
}
BOOL cmIRCConnect(char *s_server, int i_port, char* username, char *nickname, cmMSGPROC lpCallback)
{
lCallback = lpCallback;
long rc;
SOCKADDR_IN addr;
char buf[256];
rc=startWinsock();
if(rc!=0)
{
return FALSE;
}
// Socket erstellen
s=socket(AF_INET,SOCK_STREAM,0);
if(s==INVALID_SOCKET)
{
return FALSE;
}
// Verbinden
memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
addr.sin_family=AF_INET;
addr.sin_port=htons(i_port);
rc=getAddrFromString(s_server,&addr);
if(rc==SOCKET_ERROR)
{
return FALSE;
}
rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
if(rc==SOCKET_ERROR)
{
return FALSE;
}
char buf1[512];
sprintf(buf1,"USER %s 0 0 :%s\r\n",username);
int ret =send(s,buf1,strlen(buf1),0);
char buf2[512];
sprintf(buf2,"NICK %s\r\n",nickname);
ret = send(s,buf2,strlen(buf2),0);
_beginthreadex(NULL,0,RecThread,NULL,0,NULL);
}
BOOL cmIRCSend(char *msg)
{
int ret = send(s,msg,strlen(msg),0);
return !(SOCKET_ERROR == ret);
}
BOOL cmIRCSendEx(char *msg_type, char *msg_to,char *msg)
{
char str[512];
sprintf(str,"%s %s :%s\r\n",msg_type,msg_to,msg);
int ret = send(s,str,strlen(str),0);
return !(SOCKET_ERROR == ret);
}
void cmIRCGetNick(char *nick,char *SERVERmsg)
{
string rec = SERVERmsg;
int endnick = rec.find_first_of("!");
string from_nick = rec.substr(1,endnick-1);
strcpy(nick, from_nick.c_str());
}
void cmIRCGetMsg(char *message, char *SERVERmsg)
{
string rec = SERVERmsg;
int i = rec.find(":",2);
string mes = rec.substr(i+1,rec.size()-i-1);
strcpy(message, &SERVERmsg[i+1]);
}
example:
#include "cmIRC.h" // cmIRC
#include "iostream.h" // cout, cin
#include <conio.h> // _cputs
#include <stdio.h> // sprintf
// Server - CALLBACK
void CALLBACK recProc(char *msg)
{
_cputs("\n"); // neue Zeile
_cputs(msg); // Empfangene Message in der Konsole ausgeben
_cputs("\n"); // neue Zeile
_cputs("\n"); // neue Zeile
char tmp[512];
cmIRCGetNick(tmp,msg);
_cputs(tmp);
_cputs(": "); // neue Zeile
cmIRCGetMsg(tmp,msg);
_cputs(tmp);
_cputs("\n"); // neue Zeile
}
int main(int argc, char* argv[])
{
/*********** Init - Messages ****************/
cout<<"********************************\n";
cout<<"* cmIRC sample by CMatt *\n";
cout<<"* ++ 2002 ++ *\n";
cout<<"********************************\n";
cout<<"--------------------------------\n";
cout<<"Type /help for Help.\n";
cout<<"--------------------------------\n";
cout<<"\n";
cout<<"Verbinde mit Server...\n";
cout<<"Username: ";
char user[128];
cin>>user; // Username einlesen
cout<<"Nickname: ";
char nick[128];
cin>>nick; // Nickname einlesen
/*********************************************/
char server[] = "irc.chatspike.net"; // servername
int port = 6667; // port
if(cmIRCConnect(server,port,user,nick,&recProc)) // mit Server verbinden
{
cout<<"Mit Server verbunden!\n"; // Verbidung aufgebaut
cout<<"Login...\r\n";
/***** Konsoleneingaben verarbeiten *****/
char comm[512];
while(strcmp(comm,"/exit")!=0) // bei "/exit" beenden
{
cin>>comm; // Eingabe lesen
if(strcmp(comm,"/help")==0) // "/help" - Commando
{
cout<<"******************************\n";
cout<<"** cmIRC Sample - Commandos **\n";
cout<<"******************************\n";
cout<<"------------------------------\n";
cout<<"/exit = Programm beenden\n";
cout<<"/send = Sendet eine Message an den Server\n";
cout<<"------------------------------\n";
}
if(strcmp(comm,"/send")==0) // "/send" - Commando
{
char msg[64];
char chan[64];
cin>>msg;
cin>>chan;
char send[128];
sprintf(send,"%s %s \r\n",msg,chan);
cmIRCSend(send); // an den Server senden
Sleep(300); // warten
cmIRCSend(send); // zur sicherheit noch mal senden (Problem beim 1. JOIN...)
}
}
/***************************************/
}
return 0;
}
könnte sein das einige funktionen in der cmIRC.cpp net richtig oder gar nicht funzen.. hab das Teil nie richtig fertig gemacht *g*.. aber cmIRCConnect und cmIRCSend funktionieren und mehr brauchst ja erst mal net
Damit solltest du erst mal ner Verbindung zu nem Server zustande bekommen und was senden/empfangen können. Was du dann an den server schicken musst findest du im Link DrGreenthumb.
Viel glück