Dateien über Winsock versenden



  • Du kannst nicht einfach den Inhalt einer Binärdatei in einer MessageBox ausgeben, da ja auch 0-Zeichen enthalten sein können - außerdem wirst du z.B. mit dem Inhalt einer PNG-Datei in Textform wenig anfangen können 😉



  • hi!
    wie kann ich da so so einen dialog machen der mich auswählen lässt welche datei ich senden möchte????
    natürlich müsste dann ja auch der dateiname vor dem senden der datei übertragen werden, wie macht man das am besten?

    bye



  • ja beim empfänger möchte ich so einen dialog machen speichern unter.... so wie halt bei icq!!!
    bitte um hilfe!

    bye



  • #include "stdafx.h" 
    #include <winsock2.h> 
    #include <stdlib.h>
    
    #pragma comment( lib, "ws2_32.lib" )
    
    int APIENTRY WinMain(HINSTANCE hInstance, 
                         HINSTANCE hPrevInstance, 
                         LPSTR     lpCmdLine, 
                         int       nCmdShow) 
    { 
        SOCKET zielSock; 
        SOCKET listenSock; 
        SOCKET accSock; 
        sockaddr_in sai; 
        WSADATA wsa; 
    
        HANDLE fileHandle; 
        DWORD fileSize; 
        DWORD bytesRead; 
        DWORD bytesWritten; 
        char *sendeBuffer; 
        char *recvBuffer; 
        int recvBufferPos; 
        int recvLen; 
    
        char temp[50]; 
    
        // Winsock init: 
        WSAStartup(MAKEWORD(2,2),&wsa); 
    
        // Sockets initialisieren: 
        listenSock=socket(AF_INET,SOCK_STREAM,0);    // Socket das auf Verbindungen wartet 
        zielSock=socket(AF_INET,SOCK_STREAM,0);    // Socket mit dem verbunden wird 
    
        // Der empfangen-Teil soll als Server laufen: 
        sai.sin_addr.s_addr=inet_addr("192.168.0.1"); 
        sai.sin_family=AF_INET; 
        sai.sin_port=htons(5000);    
        bind(listenSock,(sockaddr*)&sai,sizeof(sockaddr_in)); 
        listen(listenSock,SOMAXCONN); 
    
        // DATEI SENDEN 
        //////////////////////////////////////////////    
    
        // Datei öffnen: 
    
    			OPENFILENAME ofn;
    
    			ZeroMemory((void *)&ofn, sizeof(ofn));
    
    			ofn.hwndOwner = hDlg;
    			ofn.lStructSize = sizeof(ofn);
    			ofn.hInstance = NULL;
    			ofn.nMaxCustFilter = 0;
    			ofn.nFilterIndex = 0;
    			ofn.lpstrFile = (char *)&SendFileName;
    			ofn.nMaxFile = MAX_PATH;
    			ofn.lpstrFileTitle = NULL;
    			ofn.nMaxFileTitle = MAX_PATH;
    			ofn.lpstrFilter = "All Files (*.*)\0*.*\0";
    			ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT;
    
    			if(!GetOpenFileName(&ofn))	
    				return(0);
    
        // Dateigröße holen: 
        fileSize=ofn.lStructSize;
    
        wsprintf(temp,"Ich sende eine %i Bytes große Datei!",fileSize); 
        MessageBox(0,temp,"lol",0); 
    
        // Speicher für die Datei und die Längenangabe holen: 
        sendeBuffer=(char*)malloc( fileSize+sizeof(DWORD) ); 
    
        // Länge in den sendeBuffer kopieren: 
        memcpy(sendeBuffer,(void*)&fileSize,sizeof(DWORD)); 
    
        // Datei hinter die Längenangabe in den sendeBuffer einlesen: 
        ReadFile(fileHandle,sendeBuffer+sizeof(DWORD),fileSize,&bytesRead,NULL); 
    
        // DateiHandle schließen: 
        CloseHandle(fileHandle); 
    
        // Mit Zielrechner verbinden: 
        connect(zielSock,(sockaddr*)&sai,sizeof(sockaddr_in)); 
    
        // Daten über Winsock senden: 
        send(zielSock,sendeBuffer,(fileSize+sizeof(DWORD)),0); 
    
        // Verbindung mit Zielrechner trennen: 
        closesocket(zielSock); 
    
        // Speicher freigeben: 
        free(sendeBuffer);
    
        // Winsock shutdown: 
        WSACleanup(); 
    
        return 0; 
    }
    

    warum funzt das mittn fileHandle nicht??;-(

    cu



  • Ich kann nirgends etwas entdecken, wo du die Datei öffnest - außerdem ist deine fileSize-Ermittlung völliger Schwachsinn, da du nur die Größe der OPENFILENAME-Struktur ausliest 😉



  • werd ich no mal durchdenken....aber frage, wie ich muss ja vorher die den dateinamen übertragen zum client bevor ich die datei sende? ist die dateigröße a noch von bedeutung?

    cu



  • #include "stdafx.h" 
    #include <winsock2.h> 
    #include <stdlib.h>
    
    #pragma comment( lib, "ws2_32.lib" )
    
    int APIENTRY WinMain(HINSTANCE hInstance, 
                         HINSTANCE hPrevInstance, 
                         LPSTR     lpCmdLine, 
                         int       nCmdShow) 
    { 
        SOCKET zielSock; 
        SOCKET listenSock; 
        SOCKET accSock; 
        sockaddr_in sai; 
        WSADATA wsa; 
    
        HANDLE fileHandle; 
        DWORD fileSize; 
        DWORD bytesRead; 
        DWORD bytesWritten; 
        char *sendeBuffer; 
        char *recvBuffer; 
        int recvBufferPos; 
        int recvLen; 
    
        char temp[50]; 
    
        // Winsock init: 
        WSAStartup(MAKEWORD(2,2),&wsa); 
    
        // Sockets initialisieren: 
        listenSock=socket(AF_INET,SOCK_STREAM,0);    // Socket das auf Verbindungen wartet 
        zielSock=socket(AF_INET,SOCK_STREAM,0);      // Socket mit dem verbunden wird 
    
        // Der empfangen-Teil soll als Server laufen: 
        sai.sin_addr.s_addr=inet_addr("192.168.0.1"); 
        sai.sin_family=AF_INET; 
        sai.sin_port=htons(5000);    
        bind(listenSock,(sockaddr*)&sai,sizeof(sockaddr_in)); 
        listen(listenSock,SOMAXCONN); 
    
        // DATEI SENDEN 
        //////////////////////////////////////////////    
    
        // Datei öffnen: 
    	OPENFILENAME ofn;
        char szFileName[MAX_PATH] = "";
    	char szFileTitle[MAX_PATH] = "";
    
        ZeroMemory(&ofn, sizeof(ofn));
    
        ofn.lStructSize = sizeof(ofn); // SEE NOTE BELOW
        ofn.hwndOwner = NULL;
        ofn.lpstrFilter = "Text Files All Files (*.*)\0*.*\0";
        ofn.lpstrFileTitle = szFileTitle;
        ofn.nMaxFileTitle = MAX_PATH;
    	ofn.lpstrFile = szFileName;
        ofn.nMaxFile = MAX_PATH;
        ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
        //ofn.lpstrDefExt = "txt";
    
        if(GetOpenFileName(&ofn))
        {
            // Do something usefull with the filename stored in szFileName 
    		MessageBox(0, szFileTitle, "Info", 0);
    
            fileHandle=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); 
    
    		if (fileHandle==INVALID_HANDLE_VALUE) 
    		{ 
    			OutputDebugString("Datei konnte nicht geöffnet werden!"); 
    			return 0; 
    		} 
    
    		// Dateigröße holen: 
    		fileSize=GetFileSize(fileHandle,NULL); 
    
    		wsprintf(temp,"Ich sende eine %i Bytes große Datei!",fileSize); 
    		MessageBox(0,temp,"lol",0); 
    
    		// Speicher für die Datei und die Längenangabe holen: 
    		sendeBuffer=(char*)malloc( fileSize+sizeof(DWORD) ); 
    
    		// Länge in den sendeBuffer kopieren: 
    		memcpy(sendeBuffer,(void*)&fileSize,sizeof(DWORD)); 
    
    		// Datei hinter die Längenangabe in den sendeBuffer einlesen: 
    		ReadFile(fileHandle,sendeBuffer+sizeof(DWORD),fileSize,&bytesRead,NULL); 
    
    		// DateiHandle schließen: 
    		CloseHandle(fileHandle); 
    
    		// Mit Zielrechner verbinden: 
    		connect(zielSock,(sockaddr*)&sai,sizeof(sockaddr_in)); 
    
    		// Daten über Winsock senden: 
    		send(zielSock,sendeBuffer,(fileSize+sizeof(DWORD)),0); 
    
    		// Verbindung mit Zielrechner trennen: 
    		closesocket(zielSock); 
    
    		// Speicher freigeben: 
    		free(sendeBuffer);
        }
    

    ok ich hab nun soweit mittn file open dialog;-) sollte man nicht vorher beim übertragen der datei den filetitle übertragen????

    cu



  • Wenn du beim Client noch wissen willst, wie die Datei hieß, dann solltest du den Namen schon übertragen 😉



  • flenders schrieb:

    Wenn du beim Client noch wissen willst, wie die Datei hieß, dann solltest du den Namen schon übertragen 😉

    na klar soll er es wissen! nur is halt jetzt die frage wie is das am besten, einfach im ersten sende() den dateinamen übertragen? oder soll man die dateigrösse a noch mit übertragen?

    cu



  • Mach ne struktur wohl sachen wie name größe sender drinne stehen, dam der user entscheiden kann ob er haben will.....


Anmelden zum Antworten