Hallo,
Folgendes:
Client verbindet sich zum Server.
Der Server muss nun sichergehen, dass der Client keine Daten sendet, bzw wenn er dies tut, nimmt er diese entgegen.
Erst wenn quasi der Eingabebuffer leer ist, sendet der Server Daten an den Clienten.
Ich verwende unter Hinzunahme der Funktion "select()" folgenden Code:
Nur das bringt keinerlei Wirkung.
Rein theoretisch müsste ja, sobald der Client mit dem Server verbindet, die Schleife abbrechen, weil ja keine Daten zum Empfangen anstehen.
Nur dies ist nicht der Fall, es entsteht eine Endlosschleif, bei der scheinbar zwar select() sagt, dass Daten da sind, aber weil keine da sind, wartet recv schön brav weiter.
Drücke ich eine Taste 'x' wird beim Server 'xDa' ausgegeben.
Das 'x' und das 'a' sind kalr, aber das 'D' nicht. Aber da sist erstmal zweitrangig.
In einem anderen Beispielcode, habe ich select verwendet, um ein CR_LF abzufangen, wenn ENter gedrückt wurde.
Ich habe überprüft, ob das gesendete zeichen ein CR oder ein LF ist.
Und dann eine andere Aktion ausführen wollen.
Da Windows jedoch CR/LF sendet, muste ich ja prüfen, ob noch ein weiteres Zeichen gesendet wurde.
Hierbei verwendete ich ebenfalls select() und da funktionierte es.
Nun frage ich mich natürlich, ob ich select() für mein Vorhaben gebrauchen kann?
Hab die Erklärungen zu select() nur bedingt kapiert, jedoch habe ich aus diversen Beispielcodes entnommen, dass select() mir sagt, ob Daten zum abholen bereitstehen oder nicht.
Und: Allgemeine Frage zu C & Strukturen
Angenommen eine Funktion gibt mir einen gecasteten Integer zurück, der einen Pointer auf eine Struktur darstellt.
Wie kann ich nun auf die einzelnen Elemente dieser Struktur zurückgreifen?
Also Quasi:
Wie kann ich nun auf die Struktur zurückgreifen, die durch den Pointer in "a" repräsentiert wird?
Hab versucht, den Pointer auf ne Struktur umzubiegen:
Aber da war der Kompiller gar nicht glücklich drüber 
Folgendes:
Client verbindet sich zum Server.
Der Server muss nun sichergehen, dass der Client keine Daten sendet, bzw wenn er dies tut, nimmt er diese entgegen.
Erst wenn quasi der Eingabebuffer leer ist, sendet der Server Daten an den Clienten.
Ich verwende unter Hinzunahme der Funktion "select()" folgenden Code:
Code:
int flush_net(int sock2) {
int maxfd;
char temp[1];
fd_set ac_state;
fd_set ac_state2;
maxfd=sock2;
FD_ZERO(&ac_state);
FD_SET(sock2,&ac_state);
ac_state2=ac_state;
while(1) {
select(maxfd+1,&ac_state2,NULL,NULL,NULL);
if(FD_ISSET(sock2,&ac_state2)) {
recv(sock2,temp,1,0);
printf(temp);
printf("a");
}else{
break;
}
}
return 0;
}
Nur das bringt keinerlei Wirkung.
Rein theoretisch müsste ja, sobald der Client mit dem Server verbindet, die Schleife abbrechen, weil ja keine Daten zum Empfangen anstehen.
Nur dies ist nicht der Fall, es entsteht eine Endlosschleif, bei der scheinbar zwar select() sagt, dass Daten da sind, aber weil keine da sind, wartet recv schön brav weiter.
Drücke ich eine Taste 'x' wird beim Server 'xDa' ausgegeben.
Das 'x' und das 'a' sind kalr, aber das 'D' nicht. Aber da sist erstmal zweitrangig.
In einem anderen Beispielcode, habe ich select verwendet, um ein CR_LF abzufangen, wenn ENter gedrückt wurde.
Ich habe überprüft, ob das gesendete zeichen ein CR oder ein LF ist.
Und dann eine andere Aktion ausführen wollen.
Da Windows jedoch CR/LF sendet, muste ich ja prüfen, ob noch ein weiteres Zeichen gesendet wurde.
Hierbei verwendete ich ebenfalls select() und da funktionierte es.
Nun frage ich mich natürlich, ob ich select() für mein Vorhaben gebrauchen kann?
Hab die Erklärungen zu select() nur bedingt kapiert, jedoch habe ich aus diversen Beispielcodes entnommen, dass select() mir sagt, ob Daten zum abholen bereitstehen oder nicht.
Und: Allgemeine Frage zu C & Strukturen
Angenommen eine Funktion gibt mir einen gecasteten Integer zurück, der einen Pointer auf eine Struktur darstellt.
Wie kann ich nun auf die einzelnen Elemente dieser Struktur zurückgreifen?
Also Quasi:
Code:
struct ERR {
int a;
int b;
};
struct ERR errn;
main() {
int a=abc();
}
int abc() {
return (int)&errn;
}
Wie kann ich nun auf die Struktur zurückgreifen, die durch den Pointer in "a" repräsentiert wird?
Hab versucht, den Pointer auf ne Struktur umzubiegen:
Code:
struct ERR asdf=(struct ERR)a;
