TCP Chat



  • Ceos schrieb:

    mal abgesehen davon, dein recv liefert entweder anzahl bytes oder 0 wenn verbindung getrennt oder -1 wenn fehler .... du solltest mal ne fehlerkontrolle einbauen und nicht einfach davon ausgehen das die verbindung schon irgendwie hinhaut.

    Hab jetzt sowas stehen

    nByte = recv(usocket,buffer,buffer_size,0);
    if(nByte < 0) cout << WSAGetLastError() ;
    

    Ich bekomme den Fehler 10093.
    Im help steht:

    Successful WSAStartup not yet performed.
    Either the application has not called WSAStartup or WSAStartup failed. The application may be accessing a socket that the current active task does not own (that is, trying to share a socket between tasks), or WSACleanup has been called too many times.

    Das scheint es zu sein was Probleme macht... und jetzt 😕



  • Du musst am Anfang deines Programms noch "WSAStartup()" aufrufen! Am Ende dann auch irgendwas zum aufräumen, bin mir aber nicht mehr sicher, evtl WSACleanUp, müsstest du aber auch bei der MSDN-Referenz zu WSAStartup finden 😉



  • Badestrand schrieb:

    Du musst am Anfang deines Programms noch "WSAStartup()" aufrufen! Am Ende dann auch irgendwas zum aufräumen, bin mir aber nicht mehr sicher, evtl WSACleanUp, müsstest du aber auch bei der MSDN-Referenz zu WSAStartup finden 😉

    Das hab ich aber in der main, das recv is ja oben drüber, vielleicht "findet" er deshalb das WSAStartup nicht.

    Wenn ich WSAStartup über den ThreadProc setze gibt er mir einen haufen Fehler, ich denke das muss in der main sein...



  • Oh, stimmt, entschuldige! Aber ich glaub ich habs: In deiner main rufst du WSACleanUp auf und dann wartest du auf die anderen Threads, heißt es wird aufgeräumt während die anderen Threads noch laufen. Mach das Cleanup einfach nach dem WaitForSingleObject.



  • Hey der Fehler ist weg, dafür hab ich jetzt folgenden bei recv:

    10038:
    Socket operation on nonsocket.
    An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.



  • Falls der gepostete Code noch aktuell ist, dann gehört shutdown () und closesocket () auch noch hinter WaitForSingleObject () und vor WSACleanup ().



  • Habs gelößt, war einiges falsch 🙄

    Danke an alle! 👍



  • werte den fehler bei deinem wsastartup doche einfach mal aus

    nRet = WSAStartup(wVersionRequested,&stWSAData);
    // Fehlerabfrage
    if(nRet < 0){
        cout << "Fehler bei WSAStartup";
        cout << WSAGetLastError(); //<----- so oder so ähnlich
    }
    

    EDIT: O_o ups da war ja noch ne seite 2 bei dem topic ... DAMN



  • MSDN:

    If successful, the WSAStartup function returns zero. Otherwise, it returns one of the error codes listed below.

    The WSAStartup function directly returns the extended error code in the return value for this function. A call to the WSAGetLastError function is not needed and should not be used.

    -> WSAGetLastError() sollte nicht benutzt werden bei WSAStartup(..).

    Simon



  • doppel autsch .... hast ja recht ... mittlerweilen kopier ich teile meines code nur noch, btw. hab mit ne tool lib angelegt und ruf einfach nur noch initWSA(); auf >_<


Anmelden zum Antworten