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. |