Per Sockets ins IRC

keytoaster

keytoaster

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

NOTICE AUTH :*** Looking up your hostname...
NOTICE AUTH :*** Found your hostname, welcome back
NOTICE AUTH :*** Checking ident
NOTICE AUTH :*** No identd (auth) response
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
 
Zuletzt bearbeitet:
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:
:zelazny.freenode.net 433 * Kle :Nickname is already in use.

... is doch schon was :P
 
Zuletzt bearbeitet:

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Server und Client für TCP und UDP

C HTTP request

Akonadi startet nicht mehr

USB Geräte per Bash Script resetten (Gerät hängt sich öfter mal auf)

Zurück
Oben