PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Server der auf 2 verschiedenen Ports lauscht?



pille710
23-06-2005, 17:06
Moin,
ich habe ein kleines Problem. Und zwar beschäftige ich mich seit ca. 2 Tagen mit BSD Sockets. Ich habe zum Test einen kleinen Server geschrieben, welcher per write() die aktuelle Systemzeit des Rechners auf dem er läuft zum verbunden Host sendet. Nichts spektakuläres also, und funktioniert auch wie gewollt.
Allerdings würde ich ihn jetzt gerne dahingehend erweitern, das er auf 2 Ports auf Verbindungen lauscht, d.h. zum Beispiel auf Port 4000 und 4005. Wenn sich nun beispielsweise jemand auf Port 4000 per Telnet verbindet, soll derjenige die Uhrzeit empfangen. Wenn nun allerdings jemand auf Port 4005 connected, soll der Server selbst einen String entgegennehmen von demjenigen, der sich verbunden hat.

Meine accept() Endlosschleife sieht bisher so aus:



for(;;)
{
if ((newsock = accept_connection(sockfd)) < 0)
{
if (errno == EINTR) continue;

perror("accept");
exit(1);
}

switch(fork())
{
case -1 :
perror("fork");
close(sockfd);
close(newsock);
exit(1);
case 0 :
close(sockfd);
strftime(string, 60, "%H Uhr %M Minuten (%S Sek.): %A, %B, %Y \n", &zeit);
write(newsock, string, 59);
exit(0);
default:
close(newsock);
continue;
}
}


Meine Frage ist jetzt weniger Quellcodespezifisch, als eher "Konzeptbedingt" ;)

Ist es möglich das ich einfach einen zweiten Socket erstelle, ihm mit bind die eigene Adresse zuweise, ihn dann "lauschen" lasse und per If Abfrage in der Endlosschleife auf connects warte, so wie praktisch auch mit "newsock" oben?
Falls ja, stellt sich für mich die Frage wie ich weiterhin mit fork() umgehen kann und wie zwischen den 2 verschiedenen Verbindungen unterschieden werden soll.
Ein kleines Stück Pseudocode o.Ä. würde mir in dem Punkt schon enorm weiterhelfen.

Vielen Dank schonmal im vorraus, ich hoffe es wird halbwegs klar worauf ich hinaus will ;)

Mfg pille.

anda_skoa
24-06-2005, 12:02
da accept() blockiert, kannst du es nicht direkt benutzen.

Du mußt beide Filedescriptors mit select() oder poll() überwachen und accept erst aufrufen, wenn es gleich wieder zurück kommen kann.

Ciao,
_

panzi
25-06-2005, 23:33
2 Threads wären auch eine Möglichkeit. kA was besser ist.

7.e.Q
28-06-2005, 14:05
Zur Frage des Themenerstellers: selbstverständlich geht das. Ich selbst habe ein Programm, das auf nunmehr 20 verschiedenen Ports lauscht.

Ich persönlich arbeite lieber mit select(). Aber ich denke, das ist Geschmackssache. Es hat beides - wie so vieles im Leben - Vor- und Nachteile. Jetzt allerdings alle Stärken und Schwächen beider Verfahrensweisen aufzuzeigen, würde hier wohl den Rahmen sprengen.

Eine sehr gute Seite zum Thema ist die des Zotteljedi (http://www.zotteljedi.de).