socketfehler 10054
-
bei zotteljedi steht dazu:
Programm empfängt Mist!
* Puffer richtig mit '\0' terminiert? CRLF richtig behandelt?
* Bei zeilenorientierten Protokollen mehrere Zeilen pro recv() behandelt?
* Vielleicht Mist gesendet? Mitsniffen!ich hab stehen:
char buf [12]; strcpy(buf, "juhuhu dateiuebertragung"); rc=send(acceptSocket,buf,9,0); if (rc ==SOCKET_ERROR) { cout<<"Fehler beim senden."<<WSAGetLastError()<<endl; return 1; } else { cout<<"Gesendet"<<endl; }
und:
char buf[256]; rc=recv(s,buf,256,0); if (rc == SOCKET_ERROR) { cout<<"Fehler beim emfangen"<<WSAGetLastError()<<endl; } else { cout<<"emfangen:"<<endl; } cout<<buf[0]<<endl;
wo muss ich da was mit \0 terminieren? ich glaub des is hier nich nötig, oder?
-
Auf jeden Fall solltest du mal deine Array-Größe kontrollieren - der Text "juhuhu dateiuebertragung" passt niemals in ein 12-Zeichen-Array (was bedeutet, alles ab dem 'i' überschreibt irgendwelche benachbarten Stack-Bereiche).
(btw, woher kommt da eigentlich die 9?)
-
so..
hab das jetzt geändert.. aber es kommt immer noch der fehler. (jetz hatte ich zum erstenmal einen buchstaben (R), sonst warns symbole xD)
daran scheint es nicht zu liegen.
könnte das vllt ein firewall problem sein?
PS: die 9 kommt noch aus dem tutorial, war da ne beispielzahl
-
Vieleicht liegt es daran das du in dein 12 Zeichen großes char Array einen viel zu langen text reinkopierst. Wenn du char benutzen willst (std::string wäre besser) dann probiere es mal so:
char buf [256]; strcpy(buf, "juhuhu dateiuebertragung"); rc=send(acceptSocket, buf, strlen(buf) + 1, 0); // strlen() + 1 für '\0' if (rc ==SOCKET_ERROR) { cout<<"Fehler beim senden."<<WSAGetLastError()<<endl; return 1; } else { cout<<"Gesendet"<<endl; }
-
das hatte ich schon erledigt.
mhh, wie würde das denn mit string aussehn? da sagt der doch best. i-was vonwegen konvertierung wenn ich da jetz einfach strings für einsetze?
-
string buf = "juhuhu ..."; rc = send(acceptSocket, buf.c_str(),buf.length()+1,0); ...
(auf der Empfänger-Seite kannst du leider keinen String als Ziel angeben - außer du packst dir eine passende Hilfsfunktion um recv() herum)
-
also i-was funzt hier nich..
ich habs mir nochma angesehn.. und wahrscheinlich was Übersehn..
wenn ich den server anmache, wartet der auf den client. dieser erstellt eine verbindung zum servdann passierts: der server stürzt ab... und ich hab kein haltepunkt gehabt -> keinen fehlercode..
also: beim serv is der fehlercode 10057.das müsste jetz aber weiterhelfen denk ich xD
*ich idiot*
greets
-
socket not connected..
hier mein code:
connectedSocket=accept(acceptSocket,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { printf("Fehler: accept, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Neue Verbindung wurde akzeptiert!\n"); }
bis dahin funzt es denk ich
er sagt auch noch "neue verb. wurde akzeptiert"..
mh aber dann fehler beim senden.. wtf?
-
poste mal den ganzen server code...
-
#include <windows.h> #include <winsock2.h> #include <cstdio> #include <cstdlib> #include <iostream> using namespace std; //Prototypen int startWinsock(void); int main() { long rc; SOCKET acceptSocket; SOCKET connectedSocket; SOCKADDR_IN addr; // Winsock starten rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } else { printf("Winsock gestartet!\n"); } // Socket erstellen acceptSocket=socket(AF_INET,SOCK_STREAM,0); if(acceptSocket==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket erstellt!\n"); } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(12345); addr.sin_addr.s_addr=ADDR_ANY; rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) { printf("Fehler: bind, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket an port 12345 gebunden\n"); } rc=listen(acceptSocket,10); if(rc==SOCKET_ERROR) { printf("Fehler: listen, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("acceptSocket ist im listen Modus....\n"); } connectedSocket=accept(acceptSocket,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { printf("Fehler: accept, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Neue Verbindung wurde akzeptiert!\n"); } //char buf [256]; //strcpy(buf, "juhuhu dateiuebertragung"); //rc=send(acceptSocket, buf, strlen(buf) + 1, 0); // strlen() + 1 für '\0' string buf = "juhuhu ..."; rc = send(acceptSocket, buf.c_str(),buf.length()+1,0); if (rc ==SOCKET_ERROR) { cout<<"Fehler beim senden."<<WSAGetLastError()<<endl; cin.get(); cin.get(); return 1; } else { cout<<"Gesendet"<<endl; } cin.get(); cin.get(); closesocket(acceptSocket); WSACleanup(); cin.get(); cin.get(); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
da isser
-
hokage schrieb:
#include <windows.h> #include <winsock2.h> #include <cstdio> #include <cstdlib> #include <iostream> ...
da isser
Was mir als erstes auffällt ist, ist das fehlende #include <string>...
Edit:
Mit
[cpp]rc = send(connectedSocket, buf.c_str(),buf.length(),0); [/cpp]
geht es.
-
Der Fehler liegt wahrscheinlich hier:
connectedSocket=accept(acceptSocket,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { printf("Fehler: accept, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Neue Verbindung wurde akzeptiert!\n"); } //char buf [256]; //strcpy(buf, "juhuhu dateiuebertragung"); //rc=send(acceptSocket, buf, strlen(buf) + 1, 0); // strlen() + 1 für '\0' string buf = "juhuhu ..."; //rc = send(acceptSocket, buf.c_str(),buf.length()+1,0); rc = send(connectedSocket, buf.c_str(),buf.length()+1,0); //<- mit dem von accept() erstellten socekt die daten senden
-
leute!
ihr seid klasse!
vielen dank für die hilfe so funktionierts
greets
-
okayy, noch eine frage..
wenn ich jetz beim server sowas einfüge:
string buf;// = "meine nachricht an dich"; cout<<"NAchricht eingeben"<<endl; cin>>buf; rc = send(connectedSocket, buf.c_str(),buf.length()+1,0);
also die nachricht eingeben lasse.. dann kommt imma nur alles bis zum ersten leerzeichen an... dann nichts mehr.. woran liegt des?
greets
-
Das liegt daran, daß cin Leerzeichen als Eingabeende einstuft (und nur den Text bis zum ersten Leerzeichen in buf speichert). Wenn du die komplette Zeile einlesen willst, nimm getline().