irc via winsock

aL1ien

Mitglied
Guten Tag,

Ich habe mich begonne, mit Winsock zu beschäftigen. Ich möchte gerne via Winsock auf einen IRC server verbinden. Mit diesem Code komme ich nicht auf den Server drauf:

Code:
// winsock_rl.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <winsock.h>
#include <stdio.h> 
#include <string>
#include <iostream>

using namespace std;

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

int startWinsock(void);

int main()

{

  long rc;
  SOCKET s;
  SOCKADDR_IN addr;

  char buf[256] = {0};
  char buf2[256] = {0};


  rc=startWinsock();

  if(rc!=0)

  {

    printf("Fehler: startWinsock, fehler code: %d\n",rc);
	system ("PAUSE");
    return 1;

  }

  else

  {

    printf("Winsock gestartet!\n");

  }

  s=socket(AF_INET,SOCK_STREAM,0);

if(s==INVALID_SOCKET)

{

  printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());

  return 1;

}

else

{

  printf("Socket erstellt!\n");

}

memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten 

addr.sin_family=AF_INET;

addr.sin_port=htons(6667); 

addr.sin_addr.s_addr=inet_addr("irc.de.quakenet.org"); 



rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));

if(rc==SOCKET_ERROR)

{

  printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
  system ("PAUSE");
  return 1;

}

else

{

  printf("Verbunden");

}



  system ("PAUSE");


  return 0;

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

  if(hostnameOrIp==NULL || addr==NULL)

    return SOCKET_ERROR;  

  ip=inet_addr(hostnameOrIp); 

  if(ip!=INADDR_NONE)

  {

    addr->sin_addr.s_addr=ip;

    return 0;

  }

  else

  {

    he=gethostbyname(hostnameOrIp);

    if(he==NULL)

    {

      return SOCKET_ERROR;

    }

    else

    {

    

      memcpy(&(addr->sin_addr),he->h_addr_list[0],4);

    }

    return 0;

  }

}

Ich weiss, dass noch vieles fehlt wie z.b "Ping" und "pong". Aber rein theoretisch sollte ich schonmal connecten können, auch wenn es mich schnell wieder raushauen wird.

vielleicht weiss einer von euch rat.

mfg alien
 
Zuletzt bearbeitet:
der "fehler" liegt bei inet_addr(), diese funktion konvertiert lediglich eine dotted ip adresse zu einem unsigned long
aus "194.124.229.58" wird dann zb. 0x3AE57CC2 (intel, little endian)

um einen domain namen wie "irc.de.quakenet.org" aufzulösen braucht es dann eine andere funktion.. ein bsp. hierfür wäre
Code:
gethostbyname()
 
allerdings wird es in diesem tutorial etwas umständlich gemacht.. dort wird aus der hostent struct der unsigned long in eine dotted ip umgewandelt, um sie dann wieder mit inet_addr() zurück zu konvertieren... nicht sehr sinnvoll wie ich finde...

besser:
Code:
addr.sin_addr.s_addr = *(ULONG*)(*dns->h_addr_list);

und das wars :)

#edit:
oh, und außerdem wurde garnicht geprüft ob der name aufgelöst werden konnte, soweit ich weiß gibt gethostbyname() einen NULL zeiger zurück, wenn die funktion fehlschlägt... bitte nochmal auf MSDN nachschlagen ;)
 

Neue Beiträge

Zurück