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:
Hier der Quelltext:
Handelt es sich hierbei um einen simplen Denkfehler meinerseits oder muss ich noch irgendetwas Wichtiges beachten?
Gruß,
keytoaster
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.NOTICE AUTH :*** Looking up your hostname...
NOTICE AUTH :*** Found your hostname, welcome back
NOTICE AUTH :*** Checking ident
NOTICE AUTH :*** No identd (auth) response
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: