socket wird ungültig



  • 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, &param, 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 😉


Anmelden zum Antworten