socket wird ungültig
-
Zeig doch mal, wie du ohne die Struktur den Thread startest. Ich vermute, daran liegt's.
-
DWORD WINAPI ThreadProc( LPVOID lpParam ) { printf("start receive thread\n"); int sockfd=(int)lpParam; char chBuf[1024]=""; while( sockfd ) { int cbRead = recv(sockfd, chBuf, 1,0); cout<<"Error: "<<WSAGetLastError()<<endl; //10038 if( cbRead <= 0 ) break; chBuf[cbRead] = '\0'; printf("DATEN: %s ANZAHL: %i\n", chBuf, cbRead); } printf("ende receive thread\n"); return 0; } CreateThread(NULL, 0, ThreadProc, &sockfd, 0, NULL);10038 - WSAENOTSOCK:
---------------------
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.
-
Habs raus bekommen woran es lag. Du hattest recht mit dem Aufruf. SO muss er aussehen:
CreateThread(NULL, 0, ThreadProc, (LPVOID)sockfd, 0, NULL);...leider habe ich das nur durch probieren herausgefunden. Kannst du mir erklären warum ich explizit (LPVOID) schreiben muss?
-
socketFreak schrieb:
SO muss er aussehen:
Das wage ich zu bezweifeln. Wenn das klappt, dann wohl nur zufällig. Zeig mal ein wenig Code drumherum, vor allem, was die Deklaration von sockfd angeht.
-
long rc=startWinsock(); if(rc!=0) printf("Fehler: startWinsock, fehler code: %d\n",rc); int sockfd; sockaddr_in servaddr; if((sockfd=socket(AF_INET,SOCK_STREAM, 0)) <0) printf("socket_error"); memset(&servaddr,0,sizeof(servaddr)); // zuerst alles auf 0 setzten servaddr.sin_family=AF_INET; servaddr.sin_port=htons(port); rc=getAddrFromString(server,&servaddr); if(rc==SOCKET_ERROR) { printf("IP für %s konnte nicht aufgeloest werden\n", server); return 1; } else printf("IP aufgeloest!\n"); rc=connect(sockfd,(SOCKADDR*)&servaddr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); return 1; } else printf("Verbunden mit %s\n", server); FLAP loginFlap; loginFlap.sendFlapLoginPacket(sockfd, "138518546", "moritz"); HANDLE m_hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID)sockfd, 0, NULL);Bingespannt

-
Warum "int sockfd;" ?
Warum nimmst du nicht "SOCKET sockfd" (in der winsock.h ist SOCKET als UINT_PTR definiert...) ?
Naja egal, vermutl. völlig unwichtig
-
Habe vor mir ein Buch liegen das den socket als int definiert.
-
Hiho
Folgendes Problemchen:
--------------------------------------------------------------------------
DWORD WINAPI foo(LPVOID a)
{
FLAP* b=(FLAP*)&a;
cout<<"Id: "<<b->getChanId()<<endl;
}FLAP loginFlap(sockfd);
foo((LPVOID)&loginFlap);
--------------------------------------------------------------------------
FLAP ist eine Klasse.
Ich kann leider in der foo Funkt. nicht auf dir ursprüglichen Werte zurück greifen, d.h. *b zeigt nicht auf loginFlap sondern zeigt einfach in`s Grüne. Leider kann ich den Datentyp LPVOID nicht ändern da foo [eigentlich] eine Threadfunktion ist - die von Natur aus LPVOID sein müssen.Wüsstet Ihr eine Möglichkeit wie ich dennoch auf die Daten, in der foo Funkt., zugreifen kann? - ich glaube mit Strukturen (struct) funktioniert es, aber sie sind eingeschränkt nutzbar. Auf eine globale Variable möchte ich verzichten.
-
FLAP* b=(FLAP*)&a;
Hier ist denke ich, das & zu viel - a ist ja schon ein Pointer.
FLAP loginFlap(sockfd); foo((LPVOID)&loginFlap);loginFlap ist eine Funktion, die ein Objekt zurückgeben soll, oder? Besser solltest du einen Pointer zurückgeben - geht das anders überhaupt?!
Nur was genau willst du mit "(LPVOID)&loginFlap" machen - ein Funktionsaufruf ist das ja nicht wirklich. Vielmehr holst du doch die Adresse eines Funktionspointers - oder so ähnlich
-
loginFlap -> ist ein Object^^
-
Man merkt, dass ich nicht viel mit C++ bzw. OO zu tun habe

Aber meine erste Bemerkung sollte trotzdem zutreffen