Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » Workaround für C-Problem gesucht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
20.06.2004, 01:11 Uhr
~Gwar
Gast


Hi,

Ich bin leider noch nicht dazu gekommen, zu prüfen ob Dateien vom System gesperrt wurden,
aber hier ist schon mal die Lösung des Filedescriptors von der Socketanbindung (Quellcode gekürzt auf relevante Teile):


C++:
#include <netinet/in.h>
int newsockfd, clientlen,pid, sockfd;
struct sockaddr_in servaddr, clientaddr;

servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons (port);

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
    perror("server: socket\n");
    exit(-1);
}/* of if */

if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof( struct sockaddr_in) ) < 0)  {
    perror("server: bind\n");
    exit(-1);
}/* of if */

if (listen(sockfd,5) < 0) {perror ("listen"); exit(-1);}
    for (;;) { /*Auf neue Verbindungen warten*/
    clientlen = sizeof (struct sockaddr);
    newsockfd = accept (sockfd, (struct sockaddr *)&clientaddr, &clientlen);
    if(newsockfd < 0) {
        perror ("server: accept"); exit(-1);
} /* of if */
    pid = fork(); /*forken*/
    switch (pid){
        case 0:     /*child*/
            if (close(sockfd) !=0){ /*Wird nicht benoetigt*/
                perror("popsocket.c: close(sockfd)");
            }/* of if */
            popcmd (newsockfd, newsockfd);
            exit(0);
        case -1:    /*error*/
            perror("popsocket.c: Fehler bei fork()");
            return FALSE;
        default:     /*parent*/
            if (close(newsockfd)!=0){/*Wird nicht benoetigt*/
                perror("popsocket.c: close(newsockfd)");
            }/* of if*/
            break;
    }/* of switch */
} /* of for */



Wie Du siehst wird bei eingehender Verbindung ein neuer Prozess gestartet (fork), der die o.g. genannte Methode popcmd mit dem fd, den er aus >>newsockfd = accept (sockfd, (struct sockaddr *)&clientaddr, &clientlen);<< erhält, aufruft.
Es ist möglich, dies mit einem einzigen fd zu tun, da TCP ja Vollduplex fähig ist.
Dort liegt auch soweit ich das beurteilen kann nicht das Problem, zumal ich mich zu meinem Server mit telnet, Ximian evolution, dem Mozilla Mail Client und der Python Poplib erfolgreich verbinden kann...

Gruß,
Gwar

Dieser Post wurde am 20.06.2004 um 09:45 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
20.06.2004, 01:33 Uhr
typecast
aka loddab
(Operator)


Ich hab auch nich erwartet, dass der Fehler da liegt.

Allerdings ist es unnötig den Parameter zweimal zu übergeben. Du brauchst auch nicht zwei streams für die Aus- und Eingabe anzulegen.

Ich kann da leider kein Problem erkennen.

Wenn du willst, dann kannst du mir den Code mal per Mail schicken. Dann schau ich ihn mir mal an. Meine Adresse findest du in meinem Profil

@Windalf: Ja. Ich habe gestern gesagt dass ich sowas nicht mache, aber das war gestern
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 20.06.2004 um 01:34 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
20.06.2004, 10:00 Uhr
ecuador



int main(void)
{
int fd;
FILE *f;
char *befehl;

void alrmHndlr(int sig) <--- steht das doch glatt in main ???
{


...oder bin ich jetzt schon doof, und man darf Funktionen nach main schreiben ?
--
Mortuari et salutant
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
20.06.2004, 12:10 Uhr
typecast
aka loddab
(Operator)


@ecuador: Ja. Du hat recht, dass das nicht geht. Allerdings ist schon im ersten Post klar, dass die Funktion im wirklichen Programm nicht in main() steht, da gwar eine Laufzeitbeschreibung gibt.

Allerdings hast du recht, dass es für andere ein wenig verwirrend sein kann.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 20.06.2004 um 12:12 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
20.06.2004, 12:18 Uhr
~Gwar
Gast


Hallo typecast und ecuador,

Im wirklichen Programm steht die Methode tatsächlich nicht in main, wird aber als innere Methode von einer anderen Methode definiert. Ist das auch verboten? Das mag eine sehr dumme Frage sein, aber ich programmiere erst seit wenigen Wochen in C...

Allerdings frage ich mich auch, warum es nicht funktionieren soll, den Signalhandler als innere Methode von Main zu definieren, denn das Programm, was ich eingangs geposted habe funktioniert doch? Habt Ihr da nähere Infos zu?

@typecast:
Vielen Dank für das Angebot. Ich bin mal wieder gerade am Windows Rechner und kann gerade nicht an den Quellcode. Ich habe allerdings auch gerade wegen dieses Problems eine eMail an meinen Professer geschickt, d.h. vielleicht kannst Du Dir die Zeit sparen

Ich habe übrigens Deinen Code ausprobiert, um zu schauen, ob der fd vom System gesperrt ist und sie ist es nicht... trotzdem Danke für den tip.

Grüße,
Gwar
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
20.06.2004, 12:56 Uhr
typecast
aka loddab
(Operator)


Ne, bei mir funktioniert das Programm nicht. Eigentlich sollte es nicht möglich sein eine Funktion in einer anderen zu definieren.

Und als Signalhandler schon zweimal nicht. Wenn das Programm bei dir läuft, dann wundert mich das stark.

Nimm mal deinen Signalhandler aus der Methode raus. Und mach es global.
Das könnte nämlich auch eine Fehlerquelle sein. Aber wie gesagt, eigentlich dürfte das gar nicht funktionieren.

Schick mir doch bitte mal das Programm. Jetzt interessiert es micht noch mehr
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
20.06.2004, 19:11 Uhr
~Gwar
Gast


Hi,

Also erst einmal zu dem Alarm:

den habe ich ersetzt, und zwar durch select() (siehe manpage: man select). Das klappt auch wunderbar (die Methode, die dann allerdings aufgerufen wird ist wieder eine Methode in einer Methode).

Das Programm, auch das welches ich eingangs postete, läuft bei mir super. daher dachte ich, es wäre kein Problem, Methoden in Methoden zu definieren...

Wenn's noch reicht schicke ich Dir das Programm morgen Abend.

Gruß,
Gwar
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
20.06.2004, 20:13 Uhr
~Gwar
Gast


PS: welchen compiler benutzt Du? Ich benutze gcc, wahrscheinlich liegt es daran
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
20.06.2004, 21:21 Uhr
typecast
aka loddab
(Operator)


Den g++ :-)

Die Frage ist welche Version. Hast du die 2.9er Version? Die lässt noch mehr durchgehen als die neueren.

Ich bekomme da bei solchen Dingen einen "parse error"
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: