CXX0030: ... hae?



  • hi,

    ich bin Neuling (siehe Code) auf dem Gebiet der C++ Programmierung und ich hab folgendes Problem:

    ich würde gerne aus dem 1. Thread (browser_to_proxy_to_server) dem 2. Thread einen Zeiger auf die Struktur "sockaddr_in" namens "inetproxy" als Parameter(Thrd1Param) übergeben, damit der 2. Thread mit den entsprechenden Daten arbeiten kann. Daraus soll mal ein Proxy Switch entstehen.

    Die Daten werden auch im 1. Thread an die Parameter-Variable übergeben. Wenn ich dann aber versuche im 2. Thread (browser_to_proxy_to_server) diese Daten zu verwenden, bekomme ich eine Access Violation.
    In der Strucktur im 2. Thread stehen keine Daten nur:

    CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden

    Ich habe die Struktur inetproxy sowohl global als auch local (im 1. Thread) definiert. Das Ergebnis bleibt aber das gleiche.

    Warum werden meine Daten nicht übernommen?
    Bitte helft mir
    THX

    DWORD WINAPI server_to_proxy_to_browser(LPVOID lpParam);
    DWORD WINAPI browser_to_proxy_to_server(LPVOID lpParam);
    
    SOCKET descriptor;
    // struct sockaddr_in inetproxy;
    
    DWORD WINAPI browser_to_proxy_to_server(LPVOID lpParam)
    {
    		int sin_size;
    		int neuer_sockel_descriptor=0,sockel_descriptor=descriptor;
    		sin_size=sizeof(struct sockaddr_in);
    		struct sockaddr_in test1;
    		DWORD dwThrdParam=descriptor,dwThreadId;
    
    		neuer_sockel_descriptor=accept(sockel_descriptor,(struct sockaddr*)&test1,&sin_size );
    
    CreateThread(NULL,0,browser_to_proxy_to_server,&dwThrdParam,0,&dwThreadId);
    
    		if (neuer_sockel_descriptor	==-1)
    				{
    					printf("Accept failed\n");
    				}
    		else
    		{
    
    		char buffer[1024];
    		int len;
    		int return_value;
    		len=sizeof(buffer);
    
    		return_value=recv(neuer_sockel_descriptor,buffer,len,0); 
    
    		printf("\n Received %d bytes,data[%s]from client\n",return_value,buffer);
    
    		struct sockaddr_in inetproxy;
    		int inetport=0;
    		const char *inetproxy_addr=0;
    		inetproxy.sin_family=AF_INET;
    		inetproxy.sin_addr.S_un.S_addr=inet_addr(inetproxy_addr);
    		inetproxy.sin_port=htons(inetport);
    		memcpy(&(inetproxy.sin_zero),"\0",8);
    		SOCKET inet_socket;
    
    		inet_socket=socket(AF_INET,SOCK_STREAM,0);
    
    		if (connect(inet_socket,(struct sockaddr *)&inetproxy,sizeof(struct sockaddr))!=0)
    				{
    					printf("Socket-Connect fehlgeschlagen\n");
    				}
    
    	        int rs_value;
    		rs_value=send(inet_socket,buffer,len,0);
    
    		DWORD dwThread1Id; 
    		sockaddr_in *Thrd1Param=&inetproxy;
    
    		HANDLE hThread1;
    		hThread1 = CreateThread(NULL,0,server_to_proxy_to_browser,&Thrd1Param,0,&dwThread1Id);
    
    		if (hThread1 == NULL)
    		{
    			printf("Thread-Erstellung Fehlgeschlagen!");
    		}
    		}
    
    	return 0;
    
    }
    
    DWORD WINAPI server_to_proxy_to_browser(LPVOID lpParam)
    {
    	sockaddr_in *newthread = (sockaddr_in*) lpParam;
    	return 0;
    }
    


  • inetproxy ist ne locale variable, wird also auf den stack gelegt und sobald die funktion endet wieder davon entfernt. Du rufst jetzt mit nem pointer auf diese variable CreateThread Thread auf und deine aufruf-funktion endet 3 Zeilen später => inetproxy gibts nicht mehr, deine thread-funktion hat also nen zeiger auf was, was es nicht mehr gibt.



  • ja das hab ich mir ja auch gedacht, aber als ich inetproxy als globale Variable (weit oben aber auskommentiert) definiert habe, hatte ich das selbe Problem.
    Das liegt doch nicht daran das ich auf die globale variable in 1. Thread etwas zuweise. Das wird doch nicht gelöscht wenn der Thread beendet wird, oder?



  • ohh.... jetzt seh ich es erst..

    versuchs mal so:

    DWORD WINAPI server_to_proxy_to_browser(LPVOID lpParam)
    {
        sockaddr_in **newthread = (sockaddr_in**) lpParam;
        return 0;
    }
    

    🤡 😃 :p



  • und wie kann ich jetzt auf die elemente zugreifen? 😕
    (angezeigt werden sie nicht mehr im Varablen Fenster)



  • rona schrieb:

    und wie kann ich jetzt auf die elemente zugreifen? 😕
    (angezeigt werden sie nicht mehr im Varablen Fenster)

    also der pointer newthread ist der selbe wie der lpParam, aber wenn ich in VC++ 6.0 die Elemente anschauen will steht da unter dem newthread-pointer wieder: CXX0030: ...



  • du übergibts deinem thread keinen pointer auf ein sockaddr_in sondern nen pointer auf nen pointer auf ein sockaddr_in.

    sockaddr_in *Thrd1Param=&inetproxy;  // Thrd1Param is ein zeiger auf inetproxy
    
    CreateThread(...,&Thrd1Param,..); 
    // du übergibts nenen zieger auf nen zeiger der auf inetproxy zeigt,
    // welcher zu auch noch auf dem stack liegt und somit ungüligt wird sobald dein Funktion endet
    

    mach das & beim CreateThread Aufruf weg und du solltest in deinem alten Thread code auf die member zugreifen können.



  • ja wenn ich mir das genauer betrachte...

    das kann ja dann nicht funktionieren!

    Danke für die Hilfe 🙂


Anmelden zum Antworten