ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit TCP Server :(
BeitragVerfasst: 29 Jan 2010, 17:49 
Offline
Nuby

Registriert: 29 Jan 2010, 17:46
Beiträge: 1
Hallo @ all,

ich hoffe ihr könnt mir einen Rat geben, ich bin mit meinem Latein am Ende.

Ich habe folgenden code für einen tcp server und in dostuff() funktion werden die
clients behandelt. Ab irgendwann habe ich mehrere gleiche
clients (zombies glaube ich), die in die Datenbank gleiche Sätze
schreiben. Hat jemand eine Erklärung? Was kann ich dagegen tun?




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
int main(int argc, char *argv[])
{
int srvrSock; /* Socket descriptor for server */
int clntSock; /* Socket descriptor for client */
struct sockaddr_in echoServAddr; /* Local address */
struct sockaddr_in echoClntAddr; /* Client address */
unsigned short echoServPort; /* Server port */
unsigned int cliAddrLen; /* Length of incoming message */
int pid;
struct sigaction sa;
int loop;

char ip[16];

/* Test for correct number of parameters */
if (argc < 2) {
fprintf(stderr,"Verwendung: %s <TCP SERVER PORT>\n", argv[0]);
exit(1);
}
//end if

/* First arg: local port */
echoServPort = atoi(argv[1]);

/* Create socket for sending/receiving */
if ((srvrSock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
DieWithError("socket() failed");
//end if

/* Construct local address structure */
memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out
structure */

echoServAddr.sin_family = AF_INET; /* Internet
address family */

echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming
interface */

echoServAddr.sin_port = htons(echoServPort); /* Local port */

/* Bind to the local address */
if (bind(srvrSock, (struct sockaddr *) &echoServAddr,
sizeof(echoServAddr)) < 0)
DieWithError("ERROR on binding");
//end if

/* Listen */
if (listen(srvrSock,5)<0)
DieWithError("listen() failed");
//end if

sa.sa_handler = sigchld_handler; // reap all dead processes
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}


/* Set the size of the in-out parameter */
cliAddrLen = sizeof(echoClntAddr);

while (1) {
printf(" loop %d \n\n", loop);
loop++;

/* Wait for a client to connect */
if ((clntSock = accept(srvrSock, (struct sockaddr *)
&echoClntAddr, &cliAddrLen)) < 0)
DieWithError("accept() failed");
//end if

/* clntSock is connected to a client! */
strcpy(ip,inet_ntoa(echoClntAddr.sin_addr));
printf("Handling client %s\n", ip);

pid = fork();
if (pid < 0)
{
DieWithError("ERROR on fork");
}
else if (pid == 0)
{
close(srvrSock);
dostuff(clntSock,ip);
close(clntSock);
exit(0);
}
else close(clntSock);

} /* end of while */

return 0; /* we never get here */
}
--
Mit freundlichen Grüßen
Burak Senel


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit TCP Server :(
BeitragVerfasst: 29 Jan 2010, 21:31 
Offline
Son-shi

Registriert: 23 Feb 2004, 14:59
Beiträge: 941
Wohnort: Esslingen
Jetzt mal eine doofe Frage: Wo ist der Bezug zu Ruby?
Der Code sieht mir doch eher nach C aus.

P.S. Ich habe mal deinen Code in eine Code-umgebung gepackt.

_________________
http://ruby.lickert.net/
http://gems.rubypla.net/


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit TCP Server :(
BeitragVerfasst: 30 Jan 2010, 00:30 
Offline
Novize

Registriert: 29 Jul 2008, 16:03
Beiträge: 10
yumos hat geschrieben:
pid = fork();
if (pid < 0)
{
DieWithError("ERROR on fork");
}
else if (pid == 0)
{
close(srvrSock);
dostuff(clntSock,ip);
close(clntSock);
exit(0);
}
else close(clntSock);



Warum duplizierst du den process und damit auch den server Socket?
Ein neuer Thread nach accept wo du den clntSock als Parameter zum auslesen übergibst sollte reichen.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit TCP Server :(
BeitragVerfasst: 30 Jan 2010, 01:19 
Offline
ri
Benutzeravatar

Registriert: 02 Jun 2006, 23:18
Beiträge: 702
yumos hat geschrieben:
Ich habe folgenden code für einen tcp server und in dostuff() funktion werden die
clients behandelt. Ab irgendwann habe ich mehrere gleiche
clients (zombies glaube ich), die in die Datenbank gleiche Sätze
schreiben. Hat jemand eine Erklärung? Was kann ich dagegen tun?
Mit fork erzeugte Kindprozesse werden nach der Beendigung zu Zombie-Prozessen, bis der Elternprozess wait aufruft. Man kann aber auch den Kernel anweisen, das automatisch zu erledigen, indem man den Signalhandler für SIGCHLD auf SIG_IGN setzt. Das hast du anscheinend auch in den Zeilen 50ff. versucht. Wenn du dort sigchld_handler in SIG_IGN umänderst, sollte es auch keine Zombie-Prozesse mehr geben.

mifu hat geschrieben:
Warum duplizierst du den process und damit auch den server Socket?
Ein neuer Thread nach accept wo du den clntSock als Parameter zum auslesen übergibst sollte reichen.
Wo liegt das Problem? Der Kindprozess bekommt nur eine Kopie des Deskriptors. forken ist eine gängige Methode um bei einem Server mehrere Clients gleichzeitig zu bedienen.

Grüße,
Matthias


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: