recv() gibt nichts aus...
-
Hallo liebe c-plusplus forum user. Ich schreibe hier nicht an meinem ersten Socket Programm. Es soll ein kleiner linux irc bot werden (gutartig :D)
Nach meinem connect zu einem irc server, sollte er etwas ausgeben, funzt mit netcat super... Wieso funktioniert mein Programm nicht, er gibt bei recv() nichts aus. Sollte ich das besser mit einem timeout in select() arbeiten? (das habe ich z.B. noch nicht gemacht)Hier mal der Source.
irc.c#include "irc.h" int ircconnect(void) { int sock; int n; struct sockaddr_in address; struct hostent *h0st; unsigned long addy; ssize_t sendlength; char recvbuf[1024]; memset( &address, 0, sizeof (address)); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sock < 0) err0r("socked initializing failed"); if((addy = inet_addr(IRCSERVER)) != INADDR_NONE) { memcpy( (char *)&address.sin_addr, &addy, sizeof(addy)); } else { h0st = gethostbyname(IRCSERVER); if(NULL == h0st) memcpy((char *)&address, h0st->h_addr, h0st->h_length); } address.sin_family = AF_INET; address.sin_port = htons(IRCPORT); printf("bis hier gehts :D\n"); connect(sock,(struct sockaddr*)&address, sizeof(address)); printf("jetz recv, komm schon\n"); while ((n = recv(sock, recvbuf, 1023, 0)) > 0) { recvbuf[n] = 0; printf("%s", recvbuf); } memset (recvbuf, 0, sizeof(recvbuf)); if (send(sock, "NICK bot", sizeof("NICK bot"), 0) != sizeof("NICK bot")) err0r("sent size didn't match (NICK bot)"); printf("jetz rec, komm schon\n"); recv(sock, recvbuf, sizeof(recvbuf), 0); recvbuf[1024] = 0; printf("%s\n",recvbuf); //send(sock, "JOIN #r00tbot\n", sizeof("JOIN #r00tbot\n"), 0); return sock; }
irc.h
#include <stdio.h> #include <string.h> //memset #include <netdb.h> #include <arpa/inet.h> #include <sys/select.h> //select() /*#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h>*/ #define IRCSERVER "irc.freenode.net" #define IRCPORT 8001 int ircconnect(void);
main.c
#include "main.h" int main(void) { ircconnect(); return 0; } void err0r(char *Message) { fprintf(stderr, "%s: %i\n", Message, strerror(errno)); exit(EXIT_FAILURE); }
main.h
#include <stdio.h> #include <stdlib.h> #include <errno.h> //err0r void err0r(char *Message);
$ gcc main.c irc.c $ ./a.out bis hier gehts :D jetz recv, komm $
Edit: Ich habs grad mit netcat gedebugged, also es muss an der Nameserverauflösung liegen. Wenn ich ne numerische IP eingebe, funzt alles super.
*Mich selber Schlag*
if (NULL == h0st)
err0r("Unkn0wn server");
memcpy( (char *)&address.sin_addr,
h0st->h_addr, h0st->h_length );so ists richtig, ich hab die addy erst in sin_addr reinkopiert, wenn die h0st == NULL ist, was totaler schwachsinn ist.