Client/Server send() recv()
-
Also da ich vorher wohl im falschen Themenbereich war, nochmal hier... (wäre auch nett, wenn sich ein Moderator findet, diesen Beitrag unter MFC löscht, danke)
Hi,
Ich sitze nun schon ne Weile an einem Problem fest.
Ich habe eine einfache Client/Server Struktur bei der ich nur eine Zahl an einen Serversenden möchte.
Der Server erhält auch ein paar Daten nur wenn ich mir die Zahl beim Server ausgeben lasse, dann steht da irgend ein Mist drinne (Sonderzeichen).Hier mal der Code vom Server:
char buffer[254]; int bytes; //Daten die empfangen werden bytes = recv(s, buffer, sizeof(buffer) - 1, 0); buffer[bytes] = '\0'; puts(buffer); //sprintf(buffer, "Received Number: %c", bytes); MessageBox(0, buffer, "WinSock Tutorial Series", MB_ICONINFORMATION);Und hier der Teilcode vom Client:
//zu sendene Zahl char clientNummer[254] = "123"; //Verbindung zum Server (Verbindung zum eigenen Socket, Serveradresse, Größe der Serveradresse) if(connect(s, (SOCKADDR *) &addr, sizeof(addr)) == SOCKET_ERROR) //wenn kein Connect, dann gibt es einen Socketerror und es wird eine Fehlermeldung ausgegeben return (MessageBox(0, "Verbindung fehlgeschlagen!", "WinSock Tutorial Series", MB_ICONEXCLAMATION)); //zusendene Daten(mein Socket, den wert aus dem Buffer, Länge des Buffer, Flag) send(s, clientNummer, strlen(clientNummer), 0);Was mache ich hier falsch? Wie kann ich nur eine simple Zahl senden?
danke
-
Wie hast Du das SOCKET Objekt 's' im Server erzeugt??
Das sollte, wenn Du TCP/IP benützt von accept(..) stammen, tut es das?Simon
-
das tut es...
Oder muss ich hier noch was ändern? Hier nochmal der komplette Code des Servers:int main() { WSADATA wsa; //initialisierung von Winsock (Parameter(Version, Infos zur API)) WSAStartup (MAKEWORD (1,1) ,&wsa); SOCKET s; s = socket (AF_INET, SOCK_STREAM, 0 ); int clientNummer = 0; sockaddr_in addr; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons (1001); addr.sin_family = AF_INET; if(bind(s,(struct sockaddr*)&addr, sizeof(addr)) == -1) { cout<<"Fehler bei bind"; } if (listen(s,3) == -1) { cout<<"Fehler beim listen"; } if (accept(s,(struct sockaddr*)&addr, 0) == -1) { cout<<"Fehler bei accept"; } char buffer[254]; int bytes; //Daten die empfangen werden bytes = recv(s, buffer, sizeof(buffer) - 1, 0); buffer[bytes] = '\0'; puts(buffer); //sprintf(buffer, "Received Number: %c", bytes); MessageBox(0, buffer, "WinSock Tutorial Series", MB_ICONINFORMATION); cout<<"\nEnde"; cin.get(); return 0; }
-
Hallo,
Ich denke das sollte so sein:
SOCKET clientSocket = accept(s,(struct sockaddr*)&addr, 0); if (clientSocket == -1) { cout<<"Fehler bei accept"; } char buffer[254]; int bytes; //Daten die empfangen werden bytes = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);http://msdn2.microsoft.com/en-us/library/ms737526.aspx
Simon
-
Ich danke dir, da war mein Fehler. Doch warum muss ich hier einen neuen Socket anlegen?
Und wenn ich gleich mal weiter spinnen darf..., ich würde nun gerne dem Server erlauben, dass bei ihm mehrere Clients ein Lebenszeichen von sich geben sollen. Der Server soll die registrieren und den Server mit dem entsprechenden Timer in einer Liste, Map oder Ähnlichem zwischenspeichern. Würde dies gerne über Threads realisieren. Wie muss ich das am Besten angehen?