socket wird ungültig
-
void bla(LPVOID hm) { SOCKET sg=(SOCKET)hm; if(!sg) printf("error\n"); //immer error } bla((LPVOID)sockfd);Wieso wird der Socket den ich übergebe ungültig?
-
SocketFreak schrieb:
Wieso wird der Socket den ich übergebe ungültig?
Was meinst du mit "wird"? War der Socket jemals gültig? Durch den Aufruf von bla kann er sich jedenfalls nicht ändern. Warum überhaupt der Cast nach void*?
-
Du solltest wohl mit Pointern arbeiten, oder deiner Funktion sagen, dass sie einen SOCKET entgegennehmen soll

-
Vorher war der Socket gültig. Die Funktion stellt eigentlich einen Thread dar. Wenn ich der Funktion einen Zeiger auf eine Struktur übergebe
struct myData{ SOCKET msock; };dann funktioniert die ganze Sache....aber warum nur?
-
socketFreak schrieb:
Die Funktion stellt eigentlich einen Thread dar.
Eigentlich musst du uns den Code zeigen.
-
struct myData{ SOCKET msock; };DWORD WINAPI ThreadProc( LPVOID lpParam ) { printf("start receive thread\n"); myData *DATA=(myData*)lpParam; SOCKET sockfd=DATA->msock; char chBuf[1024]=""; while( sockfd ) { int cbRead = recv(sockfd, chBuf, 1024,0); if( cbRead <= 0 ) break; chBuf[cbRead] = '\0'; printf("DATEN: %s ANZAHL: %i\n", chBuf, cbRead); int iCOOKIE=suchSRV_COOKIE(chBuf, cbRead); if(iCOOKIE!=-1) //Antwort SRV_COOKIE { fillCookie(chBuf, iCOOKIE, cbRead); } } printf("ende receive thread\n"); return 0; }myData param; param.msock=sockfd; HANDLE m_hThread = CreateThread(NULL, 0, ThreadProc, ¶m, 0, NULL);Bisher funktioniert das, aber ich finds blöd gelöst eine struktur zu übergeben nur wegen einem Socket. Bitte helft

-
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