Server soll befehle ausführen
-
devkid schrieb:
Mit
switchkannst du nur Integer-Werte vergleichen. Wenn du einzelne Zeichen (z. B. das erste Zeichen in deiner Zeichenkette), kannst duswitch (buf [0])verwenden. Außerdem vergleichst du mit Zahlen:'8'ist nicht das selbe wie8.Wenn du ganze Zeichenketten vergleichen willst:
if (!strcmp (buf, "8")) { ... } else if (!strcmp (buf, "9")) { ... } ...recv(..) empfängt nicht zwingend den ganzen String auf einmal. Dh. ev. ist der "String" nocht nicht null terminiert. Das würde strcmp(..) ganz schön durcheinander bringen.
Simon
-
hallo und ojemine
gleich am anfang des clients musst du ein array statt eines einzelnen zeichens deklarieren und zwar soviel um eine ip in dotted-schreibweise zu fassen. z.b.:
char ip[64]; // sollte reichen scanf("%s", ip); // string einlesenbei der printf-aktion gilt das selbe.
dann
fflush(stdin);ist verboten! wo haben die leute das immer her

die ip gibst du einfach mit
inet_addr(ip);an
da du nur eine ziffer sendest, kannst du auch direkt mit
buffer[0] == '1'arbeiten. ich würde allerdings auf der client-seite den befehl in ein z.b. int
umwandeln und den dann senden. desweiteren ist es nicht garantiert,
dass send alles mitnimmt was man reinstopft und recv auch nicht alles ausgibt.es kann durchaus sein, dass die hälfte noch unterwegs ist. du musst also in einer schleife solange senden bis alles weg ist und auch in einer schleife alles wieder empfangen, bis du das volle packet hast. dazu könnte man einfach die größe vorne weg schicken:
// SENDEN unsigned size = strlen(buf); int result = send(soc, reinterpret_cast<char *>(&size), sizeof(size), 0); // result testen unsigned rest = size; while (rest) { result = send(soc, reinterpret_cast<char *>(buf) + (size - rest), rest, 0); if (result == 0) // verbindung getrennt if (result == -1) // error rest -= result; } // EMPFANGEN: unsigned size; inr result = recv(soc, reinterpret_cast<char *>(&size), sizeof(size), 0); // result testen char *buf = new char[size]; // löschen nicht vergessen!! unsigned rest = size; while (rest) { result = recv(reinterpret_cast<char *>(buf) + (size - rest), rest, 0); if (result == 0) // verbindung getrennt if (result == -1) // error rest -= result; }allerding ist es unwahrscheinlich, dass das netzwerk ein 2 Byte Packet zerlegt.
desweiteren sendet windows immer alles oder nichts, weshalb man sich die schleife sparen kann. ist jedoch sonst nicht portabel :pbtw: falsches forum

-
ok danke für die antowrten und den support soweit... ich werd des morgen mal soweit probiern umzusetzen
der string wir doch hiermit null-terminiert oder hab ich da was falsch verstanden
buf[rc]='\0'; printf("Client sendet: %s\n",buf);ach und
fflush(stdin);hab ich aus em c/c++ tutorial von galileo computing oder so
und wie kann ich mit
send(s,buf,strlen(buf),0);einen int wert senden
buf muss doch char seinsry für die noob fragen aber ich hab halt schon lang nixmehr mit c/c++ gemacht und war eh nie viel weiter wwie die basics, die ich halt noch halbwegs so drauf hab

-
buf muss doch char sein
Nein, buf muss const char* sein (dein array wird in einen solchen pointer "konvertiert".). Du kannst auf alles sinnige und unsinnige mit buf als const char* zeigen und damit versenden.
Edit:
Bsp:
const char* buf = reinterpret_cast<const char*>(&a);
const size_t len = sizeof(a);
int ret = send(s, buf, len, 0);Simon
-
ich hab jetz ma alles soweit umgesetzt und jetzt funktioniert es endlich nochmals vielen dank an euch
-
so jungs jetz hab ich nur noch ein problem und zwar wird der server auch beendet wenn der client geschlossen wird und des liegt ja daran
while(rc!=SOCKET_ERROR) { rc=recv(connectedSocket,buf,256,0); if(rc==0) { printf("Server hat die Verbindung getrennt..\n"); break; }und wenn ich folgendes mach funzt es net un der server spinnt
while(rc!=SOCKET_ERROR) { rc=recv(connectedSocket,buf,256,0); if(rc==0) { rc=listen(acceptSocket,10); if(rc==SOCKET_ERROR) { printf("Fehler: listen, fehler code: %d\n",WSAGetLastError()); return 1; } // Verbindung annehmen connectedSocket=accept(acceptSocket,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { printf("Fehler: accept, fehler code: %d\n",WSAGetLastError()); return 1; } }kann man irgiendwie machen das der wieder vor der while schleifen aufs listen springt
-
ja, nimm listen raus aus while.
Simon
-
sry aber da haste wohl was falsch verstanden des listen is ja eigtl net drin in while ich habs halt mal reingemacht um zu probiern ob der server so nach einem disconnect vom client wieder auf neue verbindungen wartet und das richtige listen und so kommt vor der while nun weiß ich aber net wie ich machen soll das wenn der cleint beendet wird der der server anstatt zu beenden aus der while rausgeht und wieder nach oben zum listen springt...
goto geht ja nur zb in nem switch wenn ich des richtig verstanden hab also kann ich damit ja net arbeiten
-
Nein,
listenwird nur einmal aufgerufen, nicht vor jedemaccept.Normalerweise sollte so eine Schleife in etwa so aussehen (Pseudo-Code):
while (true) { new_socket = accept (s, NULL, 0); if (new_socket < 0) continue; // Kommunizieren rc = recv (s, buf, len, 0); if (rc < 0) continue; // ... }Bei jedem continue springt er dann wieder zum Anfang der Schleife und wartet auf eine neue Verbindung.
Wenn du richtig gut bist (
) kannst du jedes mal, wenn eine Verbindung ankommt, einen eigenen Thread startet, so dass du mehrere Clients verarbeiten kannst.
-
if (rc < 0) { // fehler } else if (rc == 0) { // verbindung von gegenstelle geschlossen } else { // daten bekommen... }Nur als Anmekrung...