Hallo zusammen,
ich habe mich in letzter Zeit ein wenig mit Sockets in C auseinandergesetzt und bin nun bei einem eigenen Projekt auf 2 kleinere Hindernisse gestoßen. Zum einen habe ich einen fork() Aufruf, dessen Problematik ich aber selbst erkannt habe...
Zum Anderen habe ich eine sehr eigenwillige Kommunikation mit den IRC Servern.
Erstmal zum Programm:
Die relevanten Funktionen:
Alles anzeigen
Ich denke die Funktionen sind zum Großteil selbsterklärend, bei Fragen kommen gerne nähereErklärungen hinterher.
Und zum eigentlichen Programm:
Alles anzeigen
Hier ist einmal das Problem mit dem fork()ing, weil ich halt den Child Prozess nicht abschieße und der mir dann mein Ubuntu irgendwie kleinkriegt.
Auf der anderen Seite ist die eigentliche Kommunikation mit den IRC Servern ein Problem, weil die Befehle, die ich versende (PASS, USER, NICK) zwar als solche erkannt werden, da die resultierenden Fehlermeldungen vom Server sich darauf beziehen, jedoch besagen, dass die übergebenen Parameter nicht erkannt werden, da immer die Meldung missing parameters zurück kommt.
Ich vermute also, dass etwas nicht mit meiner Übertragung falsch läuft, dass irgendwas anders encoded wird oder irgendwie die übertragung zerstückelt wird. Also bei Anregungen meldet euch einfach, ich versuche erstmal das Problem mit dem fork()ing zu lösen, was aber hoffentlich nur was kleines wird.
Mit besten Grüßen,
Christoph
ich habe mich in letzter Zeit ein wenig mit Sockets in C auseinandergesetzt und bin nun bei einem eigenen Projekt auf 2 kleinere Hindernisse gestoßen. Zum einen habe ich einen fork() Aufruf, dessen Problematik ich aber selbst erkannt habe...
Zum Anderen habe ich eine sehr eigenwillige Kommunikation mit den IRC Servern.
Erstmal zum Programm:
Die relevanten Funktionen:
C-Quellcode
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/socket.h>
- #include <unistd.h>
- #include <arpa/inet.h>
- #include "client.h"
- #define BUFSIZE 65000
- #ifndef _COMMUNICATOR_C_INCLUDED
- #define _COMMUNICATOR_C_INCLUDED
- int sock;
- char buf[BUFSIZE];
- char *getmessage(void);
- void putmessage(char *s);
- void init(char *s[]);
- void end(void);
- void init(char *s[])
- {
- struct sockaddr_in server;
- printf("%s : connect . . .\n",s[0]);
- server.sin_family = AF_INET;
- inet_pton(AF_INET,s[1],&server.sin_addr.s_addr);
- server.sin_port = htons(atoi(s[2]));
- if((sock = socket(AF_INET,SOCK_STREAM,0))!= 0)
- printf("%s : socket succesfully initialized.\n",s[0]);
- if(connect(sock,(struct sockaddr *)&server,sizeof(server))==0)
- printf("%s : succesfully connected.\n",s[0]);
- }
- void end()
- {
- close(sock);
- }
- void putmessage(char *s)
- {
- write(sock,s,sizeof(s));
- }
- char *getmessage(void)
- {
- int i,t = 0;
- char *p1,*p2;
- p1 = malloc(sizeof(*p1));
- *p1 = '\0';
- p2 = malloc(sizeof(*p2));
- *p2 = '\0';
- do
- {
- i = read(sock,buf,BUFSIZE-1);
- buf[i] = '\0';
- t += i+1;
- p2 = malloc(t);
- strcpy(p2,p1);
- strcat(p2,buf);
- free(p1);
- p1 = p2;
- }while(i == BUFSIZE-1);
- return p1;
- }
- #endif
Ich denke die Funktionen sind zum Großteil selbsterklärend, bei Fragen kommen gerne nähereErklärungen hinterher.
Und zum eigentlichen Programm:
C-Quellcode
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "client.h"
- #include "unistd.h"
- int main(int argc,char *argv[])
- {
- char input[100];
- int pid;
- init(argv);
- pid = fork();
- if(pid == 0)
- {
- while(1)
- printf("%s",getmessage());
- }
- else
- {
- do
- {
- scanf("%s",input);
- putmessage(strcat(input,"\r\n"));
- }while(strcmp(input,"quit"));
- }
- end();
- return 0;
- }
Hier ist einmal das Problem mit dem fork()ing, weil ich halt den Child Prozess nicht abschieße und der mir dann mein Ubuntu irgendwie kleinkriegt.
Auf der anderen Seite ist die eigentliche Kommunikation mit den IRC Servern ein Problem, weil die Befehle, die ich versende (PASS, USER, NICK) zwar als solche erkannt werden, da die resultierenden Fehlermeldungen vom Server sich darauf beziehen, jedoch besagen, dass die übergebenen Parameter nicht erkannt werden, da immer die Meldung missing parameters zurück kommt.
Ich vermute also, dass etwas nicht mit meiner Übertragung falsch läuft, dass irgendwas anders encoded wird oder irgendwie die übertragung zerstückelt wird. Also bei Anregungen meldet euch einfach, ich versuche erstmal das Problem mit dem fork()ing zu lösen, was aber hoffentlich nur was kleines wird.
Mit besten Grüßen,
Christoph
[17:57:06] <Cave_Man> wie mache ich buletten?
[...]
[17:58:35] <Warbringer> Der Höhlemensch auf kulinarischer Entdeckungsreise: "Wie mache ich Bouletten?"