Problem beim Versenden von einem String per Client an Server[gelöst]
-
Benutze WSAGetLastError()...
Simon
-
Fehler: 10057. Socket not connected. Aber wie kann das denn sein, wenn vorher alles geklappt hat?
-
Es kann nicht alles geklappt haben..

Zeigmal dein Code, der dein Socket erzeugt und schlussendlich int Server::Handle_Client(const int sock) aufruft.
Simon
-
#ifndef _SERVER_ #define _SERVER_ #include <iostream> #include <string> #include <winsock.h> using namespace std; #define BUF_SIZ 4096 class Server { private: SOCKET s, c; int addr_len; struct sockaddr_in addr; public: Server() {}; //Konstrukor ~Server(){}; // Destruktor int SocketStart(); int Handle_Client(const int sock); }; int Server::Handle_Client(const int sock) { char buffer[BUF_SIZ]; int bytes; bytes = recv(sock, buffer, sizeof(buffer) - 1, 0); int a = WSAGetLastError(); cout << a << endl; if (bytes == -1) { perror("recv() in get_banner() failed"); return 1; } buffer[bytes] = '\0'; cout << buffer << endl; return 0; } int Server::SocketStart() { WSADATA wsa; if (WSAStartup(MAKEWORD(1, 1), &wsa)) { printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError()); return EXIT_FAILURE; } //SOCKET ANLEGEN Sleep(2345); s = socket(PF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket() failed"); return 1; } //CONNECTEN addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(7000); addr.sin_family = AF_INET; //BINDEN if (bind(s, (struct sockaddr*) &addr, sizeof(addr)) == -1) { perror("bind() failed"); return 2; } //ZUHÖREN if (listen(s, 3) == -1) { perror("listen () failed"); return 3; } //WARTEN for(;;) { addr_len = sizeof(addr); c = accept(s, (struct sockaddr*)&addr, &addr_len); if (c == -1) { perror("accept() failed"); continue; } printf("Client from %s\n", inet_ntoa(addr.sin_addr)); Server::Handle_Client(s); closesocket(c); } closesocket(s); return 0; } #endif _SERVER_
-
Und...?
-
skullyan schrieb:
Und...?
Jetzt wartest Du ein bisschen, bis sich das jemand ansieht, der WinAPI mag oder ein C++-Mod Dich ins entsprechende Forum verschiebt, ohne im anderthalb-Stunden-Takt nachzufragen.

-
Server::Handle_Client(s);Du versuchst auf dem Server Socket zu empfangen... versuchsmal mit dem Client Soccket...

-
theta schrieb:
Server::Handle_Client(s);Du versuchst auf dem Server Socket zu empfangen... versuchsmal mit dem Client Soccket...

Der Client schickt ihm aber einen String. Muss der vom Server nicht rein theoretisch ausgelesen werden?
Client:
DWORD WINAPI writer(PVOID pParam) { char buffer[BUF_SIZ] = "gar nichts"; int bytes; SOCKET s; s = *(SOCKET*)pParam; while((bytes = recv(s, buffer, sizeof(buffer), 0)) > 0) fwrite(buffer, 1, bytes, stdout); return 0; }
-
Ich verstehe nicht, wie das funktionieren soll. Kannst Du mir ein Beispiel geben?
-
Bitte, denn ich will das echt verstehen...
-
Wie wärs mit ein wenig Geduld? Dein erster Post ist gerade mal 1.5 Stunden her...

-
außerdem wird hier nicht alles verraten.
-
Das war nun genug Geduld, oder?
-
Ich versuche gerade einen einfachen char String zu senden:
Server:
int Server::Handle_Client(const int sock) { int bytes, err; char banner[] = "Welcome to the Foobar server!\r\n"; bytes = send(sock, banner, strlen(banner), 0); if (bytes == -1) { perror("send() in send_banner() failed"); err = WSAGetLastError(); std::cout << err; return 1; } return 0; }Client:
int send_request(const int sock, const char *hostname) { char buf[BUF_SIZ]; int bytes; bytes = recv(sock, buf, sizeof(buf) - 1, 0); if (bytes == -1) { perror("recv() in get_banner() failed"); return 1; } buf[bytes] = '\0'; printf("Banner is \"%s\"\n", buf); return 0 }WSAGetLastError() gibt immer aus, dass der Socket nicht verbunden ist. 10057. Wieso?? Alles andere vorher funktioniert nämlich und auch der Socket ist angeblich verbunden, dann aber plötzlich nicht mehr?!
-
hat sich erledigt. closed.
-
Zum Glück, dein Spam war unerträglich

-
Und? Tust Du jetzt dein von accept() erzeugtes Client Socket verwenden?
Simon
-
theta schrieb:
Und? Tust Du jetzt dein von accept() erzeugtes Client Socket verwenden?
SimonJa.