Per Sockets ins IRC

Dieses Thema im Forum "C/C++" wurde erstellt von keytoaster, 13.03.2007.

  1. #1 keytoaster, 13.03.2007
    Zuletzt bearbeitet: 13.03.2007
    keytoaster

    keytoaster Jungspund

    Dabei seit:
    21.10.2006
    Beiträge:
    21
    Zustimmungen:
    0
    Ort:
    Hamm
    Hallo,

    ich habe gerade eben angefangen einen kleinen IRC-Bot in C zu programmieren. Ins IRC gelange ich wie üblich über einen Socket. Kurz nach dem Verbinden muss man nun zwei Befehle senden:

    USER username quakenet.org quakenet.org :description
    NICK nickname

    Wie es sich bei Protokollen gehört, hänge ich ein \r\n hinten dran. Danach lese ich die Daten aus dem Socket, nur leider kommen hier nur die "normalen" Daten an, die jeder Client bereits erhält, wenn die Verbindung überhaupt aufgebaut wird, sprich:

    Danach passiert nichts mehr, es scheint als würde der IRC-Server meine gesendeten Befehle einfach ignorieren.

    Hier der Quelltext:
    Code:
    
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <time.h>
    
    #define socket_t int
    
    #define RCVBUFSIZE 8192
    #define BUF 1024
    
    static void error_exit(char *errorMessage) {
    	fprintf(stderr, "%s: %s\n", errorMessage, strerror(errno));
    	exit(EXIT_FAILURE);
    }
    
    void calculate_log_time_format(char *current_time) {
            /* Nebensache: Wer mir eine kürzere Methode für diese Funktion sagen kann, her damit */
    	struct tm *tmnow;
    	time_t tnow;
    	time(&tnow);
    	tmnow = localtime(&tnow);
    	strftime(current_time, 80, "%m/%d %H:%M", tmnow);
    }
    	
    	
    void tcp_send(socket_t *sock, char *data, size_t size) {
    	printf("calling send()\n");
    	if(send(*sock, data, size, 0) == -1)
    		error_exit("Error in send()");
    }
    
    void tcp_recv(socket_t *sock, char *data, size_t size) {
    	int len;
    	len = recv(*sock, data, size, 0);
    	if(len > 0 || len != -1)
    		data[len] = '\0';
    	else
    		fprintf(stderr, "Error in recv()");
    }
    		
    int main(int argc, char **argv) {
    	struct sockaddr_in server;
    	struct hostent *host_info;
    	unsigned long addr;
    	socket_t sock;
    	char *echo_string;
    	int echo_len;
    	char *buffer = (char *)malloc(BUF);
    	char current_time[80];
    	
    	int do_exit = 0;
    	
    	
    	sock = socket(AF_INET, SOCK_STREAM, 0);
    	if(sock < 0)
    		error_exit("Error while calling socket()");
    	memset(&server, 0, sizeof(server));
    	if((addr = inet_addr("irc.quakenet.org")) != INADDR_NONE) {
    		memcpy((char *)&server.sin_addr, &addr, sizeof(addr));
    	}
    	else {
    		host_info = gethostbyname("irc.quakenet.org");
    		if(host_info == NULL)
    			error_exit("Unknown Server");
    		memcpy((char *)&server.sin_addr, host_info->h_addr, host_info->h_length);
    	}
    	
    	server.sin_family = AF_INET;
    	server.sin_port = htons(6667);
    	
    	if(connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0)
    		error_exit("Error while calling connect()");
    	
    	tcp_send(&sock, "USER simplebotc quakenet.org quakenet.org :description\r\n", BUF);
    	tcp_send(&sock, "NICK simplebotc\r\n", BUF);
    	
    	do {
    		buffer[0] = '\0';
    		tcp_recv(&sock, buffer, BUF-1);
    		calculate_log_time_format(current_time);
    		printf("[%s]<- %s\n", current_time, buffer);
    	} while(!do_exit);
    	close(sock);
    	return EXIT_SUCCESS;		
    	
    }
    
    Handelt es sich hierbei um einen simplen Denkfehler meinerseits oder muss ich noch irgendetwas Wichtiges beachten?

    Gruß,
    keytoaster
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Cool_Overrider, 11.04.2007
    Zuletzt bearbeitet: 11.04.2007
    Cool_Overrider

    Cool_Overrider NoOb

    Dabei seit:
    10.02.2006
    Beiträge:
    18
    Zustimmungen:
    0
    Ort:
    Österreich
    Hallo keytoaster!

    Bin leider kein C++ geek, aber bei mir funktioniert folgenes mit Python:

    Code:
     # -*- coding: utf-8 -*- 
    import sys
    import socket
    import string
    HOST= "irc.freenode.net"
    PORT=6667
    NICK="xXxxX"
    CHANNEL = "#unixboard"
    IDENT="x"
    REALNAME="xxXXxx"
    readbuffer = ""
    s=socket.socket( )
    s.connect((HOST, PORT))
    s.send("NICK %s\r\n" % NICK)
    s.send("USER %s %s bla :%s\r\n" % (IDENT, HOST, REALNAME))
    
    while 1:
    	readbuffer=readbuffer + s.recv(1024)
    	temp=string.split(readbuffer, "\n")
    	readbuffer=temp.pop( )
    	for line in temp:
    		line=string.rstrip(line)
    		#line=string.split(line)
    		username = line.split('!')[0].strip(':')
    		print line
    		if(line.find('PING') != -1):
    			s.send("PONG %s\r\n" % line[1])
    			
    		if(line.find('freenode-connect!') != -1):
    			s.send("JOIN %s\r\n" % CHANNEL )
    			
    
    
    Hoffe es hilft dir weiter....


    EDIT:

    Ich hab jetzt deinen Code folgendermaßen geändert:


    Code:
    do {
                    buffer[0] = '\0';
                    tcp_recv(&sock, buffer, BUF);
                    calculate_log_time_format(current_time);
    		if (strlen(buffer) != 0)
    		{
                    	cout<<buffer<<endl;
    			string test = buffer;
    			if(test.find("(auth) response", 0) == 27)
    			{
    				tcp_send(&sock, "NICK Kle\r\n", BUF);
    			}
    
    		}
            } while(!do_exit);
    
    Das Poblem war dass du den text "NICK xxxx" zu früh gesendet hasch...

    Wenn du den Code einbaust & compeliersch, dann kommt:
    ... is doch schon was :P
     
Thema:

Per Sockets ins IRC

Die Seite wird geladen...

Per Sockets ins IRC - Ähnliche Themen

  1. GlassFish Server 4.0 unterstützt Java EE 7 und Websockets

    GlassFish Server 4.0 unterstützt Java EE 7 und Websockets: Oracle hat die Open-Source-Edition des skalierbaren Java-Applikationen-Servers Glassfish in der Version 4.0 fertiggestellt. Glassfish 4...
  2. Nginx 1.4.0 mit Websockets und SPDY

    Nginx 1.4.0 mit Websockets und SPDY: Die Entwickler des freien Webservers Nginx haben Version 1.4.0 mit zahlreichen Neuerungen veröffentlicht, wie zum Beispiel die Unterstützung für...
  3. IDS Suricata 1.4 mit Unix-Sockets und IP-Reputation

    IDS Suricata 1.4 mit Unix-Sockets und IP-Reputation: Die Open Information Security Foundation (OISF) hat das netzwerkbasierte Einbruchserkennungssystem (NIDS) Suricata in der Version 1.4...
  4. cacti killt meine php5-sockets für nginx

    cacti killt meine php5-sockets für nginx: hi, ich versuche gerade cacti per nginx zum laufen zubringen. nur jedesmal, wenn ich die auf die cacti seite zugreifen will sterben mir...
  5. Siffer für UNIX domain sockets

    Siffer für UNIX domain sockets: Hi, ich suche einen Sniffer für UNIX domain sockets. Also ich habe einen Socket und möchte sehen, was da so für Daten ein- und ausgehen, kennt...