Datei über send() verschicken
-
ich suche ein möglichkeit über meinen TCP-Server oder auch dem client (ist erstmal egal) eine Datei im binären modus zu verschiken.
laut meines wissens kann man mit send() nur char variablen verschicken
deswegen such ich eine möglichkeit eine Datei einzulesen (binär) sie über tcp zu verschicken und das der Client die datei dann wieder zusammenbauthier mal mein client code
von meinem update programm
.cpp
#include "Update-Client.h" int janein; int main() { cout<<"Auf Updates prüfen?\nJa=1\nNein=0\n="; cin>>janein; if(janein==1) { CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Update, NULL, NULL,0); cout<<"\n\nEs wird geprüft einen kleinen moment bitte :P"; } for(;;) Sleep(100000); return 0; }
Update-Client.h
#pragma comment( lib, "ws2_32.lib" ) #include <windows.h> #include <stdio.h> #include <iostream> using namespace std; char opts[5001]; long rca; SOCKET sa; int ja; long getIPAdress (char* getHost, SOCKADDR_IN* addr) { unsigned long ip; HOSTENT* he; if (getHost == NULL || addr == NULL) return SOCKET_ERROR; ip = inet_addr (getHost); if (ip != INADDR_NONE) addr->sin_addr.s_addr = ip; else { he = gethostbyname (getHost); if (he == NULL) return SOCKET_ERROR; else memcpy (&(addr->sin_addr), he->h_addr_list[0], 4); } return 0; } int startWinsock(void); void Update() { SOCKADDR_IN addr; while(1) { int breaak = 0; char buf[1000]=""; // Winsock starten rca=startWinsock(); // Socket erstellen sa=socket(AF_INET,SOCK_STREAM,0); if(sa==INVALID_SOCKET) // Verbinden memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(8118); getIPAdress ("localhost", &addr); rca=connect(sa,(SOCKADDR*)&addr,sizeof(SOCKADDR)); char code[100]; rca=recv(sa,code,100,0); code[rca]='\0'; rca=recv(sa,buf,1000,0); buf[rca]='\0'; system("CLS"); if((strcmp("1.1",code)) ==0 ) { ja = MessageBoxA(NULL,"Es ist die Version 1.1 verfügbar wollen sie updaten ?","Updaten?", MB_YESNO | MB_ICONQUESTION); if (ja==6) { ShellExecuteA(NULL,"open",buf,NULL,NULL,1); exit(1); } breaak = 1; } else if((strcmp("1.0",code)) ==0 ) { ja = MessageBoxA(NULL,"Es ist die Version 1.0 verfügbar wollen sie updaten ?","Updaten?", MB_YESNO | MB_ICONQUESTION); if (ja==6) { ShellExecuteA(NULL,"open",buf,NULL,NULL,1); exit(1); } breaak=1; } else {cout<<"Kein Update Verfügbar!!!";breaak=1;for(;;)Sleep(2000);} if(breaak == 1) { Sleep(10000); } Sleep(1000); closesocket(sa); WSACleanup(); } } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
stellt bitte keine kritik an meinem code (es ist nur aus lw enstanden und war nur zum test)
ich möchte nur wissen wie ich somit jetzt daten (bilder,anwendungen etc.) übertragen kann
lg, Tibolus
-
Editiere deinen Code mal so, dass man ihn vernünftig lesen kann. Weniger Leerzeilen, richtig einrücken etc.
Dann kann man auch was dazu schreiben. (Und da sind so einige Patzer drin.)
PS: Da gehört eher ins WinAPI Forum.
-
cooky451 schrieb:
Editiere deinen Code mal so, dass man ihn vernünftig lesen kann. Weniger Leerzeilen, richtig einrücken etc.
Dann kann man auch was dazu schreiben. (Und da sind so einige Patzer drin.)
PS: Da gehört eher ins WinAPI Forum.okey aber warum WinAPI ^^
kannst du mir das mal erklären ? das meinen immer alle
ich editire ebend
-
Tibolus schrieb:
okey aber warum WinAPI ^^
kannst du mir das mal erklären?Standard C++ kennt keine Sockets.
Die Funktionen kommen, tada, aus der WinAPI.
Aber das nur am Rande.
-
cooky451 schrieb:
PS: Da gehört eher ins WinAPI Forum.
Kommt drauf an, vielleicht will er auch wissen, wie der C++-Teil seines Codes ist. Aber das ist schnell zu beantworten:
@Threadersteller:- Du machst das berüchtigte C mit cout, welches in schlechten Büchern als C++ verkauft wird (oder auch gerne als C/C++), aber nichts mit echtem C++ zu tun hat und auch keine echten Vorteile gegen C hat.
- using namespace in Headern ist extrem schlechter Stil.
- Globale Variablen sind extrem schlechter Stil.
- Globale Variablen in Headern sind schlichtweg falsch.
- Alles im Header zu implementieren ist ebenfalls ... ungewöhnlich. Besonders in C (in C++ gäbe es ein paar Gründe dafür, die hier aber nicht vorliegen)
- Alles im Header implementieren mit externer Bindung ist schlichtweg falsch.
- Im Rest sind sicherlich auch noch haufenweise Fehler, dafür müsste ich besser Winapi können. Konstrukte wie
char user_name[255]; nSize = sizeof( user_name ); GetUserNameA( user_name, &nSize );
sehen jedenfalls äußerst abenteuerlich aus.
Und nun ab nach Winapi, dann können die Experten auch nochmal ihren Senf dazu geben, ob du die Winapi-Teile überhaupt richtig benutzt.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ein kleiner Zusatz noch von mir:
Wenns Dir hier nur drum geht eine automatische Updatefunktionen einzubauen, dann geht das mit libCURL imho viel schneller und eleganter, einen http-server vorrausgesetzt.
Einfach eine Textdatei auf dem Server anlegen, mit der Versionsnummer. Runterladen mit libCURL, auswerten, die Frage nach dem Update stellen und dann die neue Version runterladen.
Das braucht weniger Code als mit "rohen" Sockets und ist angenehmer zu programmieren. Bei Interesse poste ich gerne nen Beispiel ;).
-
ne ich suche ienfahc ne möglichkeit eine datei rüberzuverschicken
egal wie es hat nicht nur den sinn für mein update programm
-
Dafür gibt es Tausende fertige Programme und Libraries. Am einfachsten macht es die WinAPI dir mit TransmitFile().
-
Tibolus schrieb:
laut meines wissens kann man mit send() nur char variablen verschicken
Dann schau dir nochmal die Paramter von send() genauer an.
Dass da ein Zeiger auf char und ein Parameter len vorhanden sind, sollte schon genug Hinweis sein, dass da ein Speicherbereich übertragen wird.
-
stellt bitte keine kritik an meinem code (es ist nur aus lw enstanden und war nur zum test)
-
Jodocus schrieb:
Dafür gibt es Tausende fertige Programme und Libraries. Am einfachsten macht es die WinAPI dir mit TransmitFile().
kannst du mir mal ein beispielcode geben ?
-
-
Hallo,
warum liest du nicht einfach eine Datei in einem Buffer ein und schickst diesen Buffer über Winsock ab?
Wenn die Datei groß ist, solltest du sie häppchenweise verschicken.. dazu immer ein Flag mitsenden wann das letzte Paket kommt und gut ist... Auf der anderen Seite nur noch zusammensetzten. Das ganze packst du schön in eine Struktur.
Für das lesen und schreiben von Dateien eignet sich die WinAPI hervorragend.
Gruß, Nicky
-
Tibolus schrieb:
...
laut meines wissens kann man mit send() nur char variablen verschicken
deswegen such ich eine möglichkeit eine Datei einzulesen (binär) sie über tcp zu verschicken...Nach diesem Satz ist mir klar das Dir die nötigen Grundlagen der Programmiersprache fehlen. Dort solltest Du mal ansetzen...