Proxy Switch
-
hi,
aehm ich hab mal ne Frage. Ich bin dabei einen Proxy Switch zu entwickeln. Das Printip funktioniert auch schon ganz gut (bin auch Grad mit Hilfe meines Programmes im Netz). Mein Problem dabei besteht in nur kleinen aber nervigen Dingen. Vielleicht könnt Ihr Euch mal meinen Code anschauen und mir helfen?
Die Probleme bestehen darin, daß wenn ich eine Seite geladen hab am Ende oft, aber nicht immer die Fehlermeldung "Document contains no data" kommt. Fehler in der Funktionsweise der Seiten hab ich aber bisher noch nicht wirklich feststellen können.
Ich benutze Mozilla 1.6Weiterhin kann ich mich zwar auf der GMX-Webseite zwar einloggen, doch dann wird der Seiteninhalt verschoben dargestellt und ich kann mich nicht wieder ausloggen. Da kommt ebenfalls die Meldung "Document contains no data". Das kann irgendwie nur an meinen Programm liegen, da bei einer direkten Verbindung ins Netz diese Fehler nicht auftreten.

BIG THX for help
#include <winsock.h> #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <iostream.h> #define PORT 8888 #define HOST localhost #pragma comment(lib,"ws2_32.lib") // Um Betriebssystemfunktionen ausführen zu können ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// struct inetproxy { struct sockaddr_in proxy; bool user_proxy; bool proxy_server; HANDLE connection_ok;//Zur Synchronisation so irgendwie SOCKET browser_proxy_sock; SOCKET inet_socket; bool datalog; bool _handle; }; DWORD WINAPI server_to_proxy_to_browser(LPVOID lpParam); DWORD WINAPI browser_to_proxy_to_server(LPVOID lpParam); SOCKET descriptor; FILE *Datei; // DATENFLUSS-Log-Datei ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// DWORD WINAPI browser_to_proxy_to_server(LPVOID lpParam) { inetproxy *helper = new inetproxy; // lokale Variablen int sin_size; SOCKET new_sock=0; SOCKET sockel_descriptor=descriptor; sin_size=sizeof(struct sockaddr_in); struct sockaddr_in test1; DWORD dwThreadId; //SOCKET accepten new_sock=accept(sockel_descriptor,(struct sockaddr*)&test1,&sin_size ); // Initialisierungen helper->user_proxy=TRUE; helper->proxy_server=FALSE; helper->_handle = FALSE; //für Senden an Browser helper->browser_proxy_sock=new_sock; //neuen Thread zum weiteren listen CreateThread(NULL,0,browser_to_proxy_to_server,&sockel_descriptor,0,&dwThreadId); //accept()-ERROR Checking if (new_sock ==-1) { printf("Fehler: Accept fehlgeschlagen: %d\n",WSAGetLastError()); } else { // Daten vom lokalen Socket empfangen char buffer[600]; int recive_value; int send_value; // 1. Anfrage von Browser recive_value=recv(new_sock,buffer,sizeof(buffer),0); // DATENFLUSS-Log-Datei // Datei = fopen("data.txt","r+"); // fseek(Datei,0,SEEK_END); // fprintf(Datei,"\n\n BROWSER ANFRAGE AN PROXY START (UsertoProxytoServer) \n\n",0); // fwrite(buffer,sizeof(char),recive_value+2,Datei); // fprintf(Datei,"\n\n BROWSER ANFRAGE AN PROXY ENDE (UsertoProxytoServer) \n\n",0); // fclose(Datei);} //ERROR Checking if (recive_value== SOCKET_ERROR) { printf("Fehler: Empfangsfehler der Browser-Anfrage: %d \n",WSAGetLastError()); closesocket(helper->browser_proxy_sock); helper->user_proxy=FALSE;} if (recive_value == 0) { printf("Fehler: Verbindung zu Browser unterbrochen: %d \n",WSAGetLastError()); closesocket(helper->browser_proxy_sock); helper->user_proxy=FALSE;} //# ifdef _DEBUG // printf("\n %d bytes Daten von Browser empfangen:\n [%s]\n",recive_value,buffer); //# endif DWORD dwThread1Id; HANDLE hThread1; hThread1 = CreateThread(NULL,0,server_to_proxy_to_browser,helper,0,&dwThread1Id); if (hThread1 == NULL) { printf("Thread-Erstellung Fehlgeschlagen!"); } helper->connection_ok=CreateEvent(NULL,TRUE,FALSE,NULL); //Warten auf die Verbindung zum Proxy-Server (60 sec) if(WaitForSingleObject(helper->connection_ok,60000)==WAIT_OBJECT_0) { helper->_handle=TRUE;} if (helper->_handle==TRUE) { CloseHandle(helper->connection_ok); helper->_handle=FALSE;} //Access Violation ntnet.dll while(helper->user_proxy && helper->proxy_server) { // Senden zu Proxy-Server über SOCKET inet_socket (aufgebaut in server_to_proxy_to_user) send_value=send(helper->inet_socket,buffer,recive_value,0); // DATENFLUSS-Log-Datei // Datei = fopen("data.txt","r+"); // fseek(Datei,0,SEEK_END); // fprintf(Datei,"\n\n BROWSER ANFRAGE AN SERVER GESENDET START (UsertoProxytoServer / in while-Schleife) \n\n",0); // fwrite(buffer,sizeof(char),send_value+2,Datei); // fprintf(Datei,"\n\n BROWSER ANFRAGE AN SERVER GESENDET ENDE (UsertoProxytoServer / in while-Schleife) \n\n",0); // fclose(Datei);} // send()-Funktion ERROR-Checking if (send_value == SOCKET_ERROR) { printf("Senden der www-Anfrage fehlgeschlagen: %d \n",WSAGetLastError()); helper->proxy_server=FALSE; closesocket(helper->inet_socket); continue;} //Empfangen weiterer Browser-Anfragen recive_value = recv(helper->browser_proxy_sock,buffer,sizeof(buffer),0); // DATENFLUSS-Log-Datei // Datei = fopen("data.txt","r+"); // fseek(Datei,0,SEEK_END); // fprintf(Datei,"\n\n BROWSER ANFRAGE AN PROXY START (UsertoProxytoServer / in while-Schleife) \n\n",0); // fwrite(buffer,sizeof(char),recive_value+2,Datei); // fprintf(Datei,"\n\n BROWSER ANFRAGE AN PROXY ENDE (UsertoProxytoServer / in while-Schleife) \n\n",0); // fclose(Datei);} // recv()-Funktion ERROR-Checking if (recive_value== SOCKET_ERROR) { printf("Fehler: Empfangsfehler der Browser-Anfrage: %d \n",WSAGetLastError()); closesocket(helper->browser_proxy_sock); helper->user_proxy=FALSE; continue;} if (recive_value == 0) { printf("Fehler: Verbindung zu Browser unterbrochen: %d \n",WSAGetLastError()); closesocket(helper->browser_proxy_sock); helper->user_proxy=FALSE; break;} //# ifdef _DEBUG // printf("\n %d bytes Daten von Browser empfangen:\n [%s]\n",recive_value,buffer); //# endif } // END WHILE // Aufräumen if (helper->proxy_server==TRUE) { helper->proxy_server=FALSE; closesocket(helper->inet_socket);} if (helper->user_proxy==TRUE) { helper->user_proxy=FALSE; closesocket(helper->browser_proxy_sock);} } return 0; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// DWORD WINAPI server_to_proxy_to_browser(LPVOID lpParam) { inetproxy *helper = (inetproxy*) lpParam; // USER INTERFACE int inetport=8080; const char *inetproxy_addr="82.185.182.115"; helper->proxy.sin_family=AF_INET; helper->proxy.sin_addr.S_un.S_addr=inet_addr(inetproxy_addr); helper->proxy.sin_port=htons(inetport); memcpy(&(helper->proxy.sin_zero),"\0",8); // !!!!!!!!!USER INETRFACE!!!!!!!!!!!!! /*CHECK printf("S_Addresse %d ",helper->proxy.sin_addr.S_un.S_addr); printf("Sin_Family %d ",helper->proxy.sin_family); printf("Sin_Port %d ",helper->proxy.sin_port); printf("Sin_zero %d ",helper->proxy.sin_zero); */ struct sockaddr_in server; int recive_value,send_value; char buffer[10000]; server.sin_addr.S_un.S_addr = helper->proxy.sin_addr.S_un.S_addr; server.sin_family = helper->proxy.sin_family; server.sin_port = helper->proxy.sin_port; memcpy(&(server.sin_zero),helper->proxy.sin_zero,8); helper->proxy_server=TRUE; // Verbindung erfolgreich //SOCKET aufbauen + ERROR Checking helper->inet_socket=socket(helper->proxy.sin_family,SOCK_STREAM,0); if (helper->inet_socket==INVALID_SOCKET) { printf("Fehler: SOCKET-Aufbau zu Inet-Proxy fehlgeschlagen: %d \n",WSAGetLastError()); helper->proxy_server=FALSE; // Verbindung nicht erfolgreich SetEvent(helper->connection_ok);} // Startsignal setzen // SOCKET connect + ERROR Checking if (connect(helper->inet_socket,(struct sockaddr *)&server,sizeof(struct sockaddr)) !=0) { printf("Fehler: SOCKET-Connect fehlgeschlagen: %d \n",WSAGetLastError()); helper->proxy_server=FALSE; // Verbindung nicht erfolgreich SetEvent(helper->connection_ok);} // Startsignal setzen SetEvent(helper->connection_ok); // Startsignal setzen while(helper->user_proxy&&helper->proxy_server) { // Daten von Server empfangen recive_value = recv(helper->inet_socket,buffer,sizeof(buffer),0); // DATENFLUSS-Log-Datei // Datei = fopen("data.txt","r+"); // fseek(Datei,0,SEEK_END); // fprintf(Datei,"\n\n SERVER ANWORT AN PROXY START (ServertoProxytoUser) \n\n",0); // fwrite(buffer,sizeof(char),recive_value+2,Datei); // fprintf(Datei,"\n\n SERVER ANWORT AN PROXY ENDE (ServertoProxytoUser) \n\n",0); // fclose(Datei); // recv()-Funktion ERROR Checking if (recive_value==SOCKET_ERROR) { printf("Fehler: Empfangen der Daten von Server fehlgeschlagen: %d \n",WSAGetLastError()); closesocket(helper->inet_socket); helper->proxy_server=FALSE; break;} if (recive_value==0) { printf("Server hat Verbindung geschlossen: %d \n",WSAGetLastError()); closesocket(helper->inet_socket); helper->proxy_server=FALSE; break;} // Senden der vom Server empfangenen Daten an Browser send_value = send(helper->browser_proxy_sock,buffer,recive_value,0); // DATENFLUSS-Log-Datei // Datei = fopen("data.txt","r+"); // fseek(Datei,0,SEEK_END); // fprintf(Datei,"\n\n SERVER ANTWORT AN BROWSER gesendet START (ServertoProxytoUser) \n\n",0); // fwrite(buffer,sizeof(char),send_value+2,Datei); // fprintf(Datei,"\n\n SERVER ANTWORT AN BROWSER gesendet ENDE (ServertoProxytoUser) \n\n",0); // fclose(Datei);} // ERROR Checking if (send_value == SOCKET_ERROR) { printf("Fehler: SOCKET_ERROR Senden an Browser fehlgeschlagen: %d \n",WSAGetLastError()); closesocket(helper->browser_proxy_sock); helper->user_proxy=FALSE; break;} # ifdef _DEBUG printf("\n %d bytes Daten von Server empfangen:\n [%s]\n",recive_value,buffer); # endif } // END WHILE // Aufräumen if (helper->proxy_server==TRUE) { helper->proxy_server=FALSE; closesocket(helper->inet_socket);} if (helper->user_proxy==TRUE) { helper->user_proxy=FALSE; closesocket(helper->browser_proxy_sock);} return 0; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int startserver() { /* Start: Verbindung zwischen Browser und Proxy-Switch herstellen dazu: 1. SOCKET aufbauen 2. Struktur sockaddr_in beschreiben - Adresse egal - Port 8888 ->(muss als Port bei Proxyeinstellungen im Browser verwendet werden 3. SOCKET binden -> bind() 4. SOCKET abhören (nach ankommenden Daten / Browser-Anfragen)-> listen() */ // lokale Variablen definieren struct sockaddr_in local; //Structur mit Socketadresse und Portangaben SOCKET socket_descriptor=0; // WINDOWS-SOCKET-FUNCTIONS initialisieren + ERROR Checking WSADATA wsaData; if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { fprintf(stderr, "WSAStartup failed.\n"); exit(1);} // Struktur beschreiben local.sin_family=AF_INET; local.sin_addr.S_un.S_addr=INADDR_ANY; //Adresse egal da nur Port abgehört werden muss um Anfragen des Browsers zu holen local.sin_port=htons(PORT); memcpy(&(local.sin_zero),"\0",8); // SOCKET aufbauen socket_descriptor = socket (AF_INET,SOCK_STREAM,0); // ERROR Checking!! if (socket_descriptor ==INVALID_SOCKET) { printf("Fehler: SOCKET-Aufbau fehlgeschlagen: %d \n ",WSAGetLastError()); WSACleanup(); } // SOCKET binden + ERROR Checking if (bind(socket_descriptor,(struct sockaddr *)&local,sizeof(struct sockaddr))!=0) { printf("Fehler: SOCKET-Binding fehlgeschlagen: %d \n ",WSAGetLastError()); WSACleanup( ); } // SOCKET listen + ERROR Checking if (listen(socket_descriptor, 10)!=0) { printf("Fehler: SOCKET-Listen fehlgeschlagen: %d \n ",WSAGetLastError()); WSACleanup( );} else { printf("Socket-Listen fuer 1. Browser Request\n");} return socket_descriptor;//für globale Variable für den Browser-Listen-SOCKET } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// main() { //startserver // DATENFLUSS-Log-Datei erstellen; //inetproxy *helper = new inetproxy; //char frage; descriptor=startserver(); //helper->datalog=FALSE; //printf("Soll der Datenfluss aufgezeichnet werden (j/n)?"); //while(1) // { scanf("%c",&frage); // if (frage == 'j') { helper->datalog=TRUE; // break;} // if (frage == 'n') { helper->datalog=FALSE; // break;} // } //if (helper->datalog==TRUE) // { Datei = fopen("data.txt","w+"); // fclose(Datei);} //Thread für Browser_to_Proxy_to_Server DWORD dwThreadId; HANDLE hThread; // Thread Erstellung + ERROR Checking hThread = CreateThread(NULL,0,browser_to_proxy_to_server,NULL,0,&dwThreadId); if (hThread == NULL) { printf("Fehler: Thread-Erstellung Fehlgeschlagen!");} else { // Programm kann mit der Eingabe von "q" beendet werden while(1) if(getchar()=='q') { printf("Programm gestoppt"); closesocket(descriptor); break; } } return 0; }
-
Hallo zusammen!
Hab mich gleich erstmal registriert.
Ich hab das Problem nur auf WinXP und/oder Win2k
Auf Win98SE funzt das Programm (inzwischen leicht abgeändert, aber Funktionsweise immernoch die selbe) ohne Probleme

Hat irgendjemand eine Vermutung woran das liegen könnte (irgendetwas das direkt mit dem Quellcode zusammenhängt)? Ich hab nämlich keine! Das das 2 bzw. 3 unterschiedliche Betriebssysteme sind weiß ich selber.