TransmitFile ?

ProgX

Grünschnabel
Hi,

Ich hab ein kleines Problem mit der funktion TransmitFile klick .
Also wenn ich die Funktion dazu verwende txt files oder anderes dieser Art, zu versenden klappt alles wunderbar. Aber wenn ich versuche eine exe zu versende dan kommt beim server irgenwie nix an ?
Code:
client :
...
HANDLE hFile = CreateFile(argv[1],           
		               GENERIC_READ,             
		                FILE_SHARE_READ,            
		                NULL,                     
		                OPEN_EXISTING,           
		                 FILE_ATTRIBUTE_SYSTEM,    
		                 NULL);                   
...
if(TransmitFile(s, hFile, NULL, NULL, NULL, NULL, TF_DISCONNECT))
	printf("Gesendet !");
else
	printf("nicht gesendet !");
server :
...
ofstream datei("bla.exe", ios::binary);
...
while(rc != SOCKET_ERROR)
{
	rc = recv(connectedSocket, buf, sizeof(buf), 0);
	buf[rc] = '\0';
	datei << buf;
	for(int i = 0; i <= 1024; i++)
		buf[i] = 0;
}
...

Hat jemand ein kleines Beispiel für mich oder kann mir erklären wie es richtig geht :)

mfg progX :-)
 
Ist vielleicht ein Firewall oder sonstiger Scanner im Weg, der ausführbare Dateien blockt?
Das 100% nicht ! Sonst wäre überhaupt kein Socket erstellt worden und ich hätte keine txt files senden können :)
wenn ich die Funktion dazu verwende txt files oder anderes dieser Art, zu versenden klappt alles wunderbar

Hat jemand ein kleines Beispiel für oder ein Link mich :)

mfg ProgX :-)
 
Zuletzt bearbeitet:
Das 100% nicht ! Sonst wäre überhaupt kein Socket erstellt worden und ich hätte keine txt files senden können
Schade. Ich habe ja gesagt, dass ich nur rate.

@Kachelator: Dieter Nuhr hat da übrigens so einen Satz, den ich mir neben den Monitor pinnen sollte, damit ich immer dran denke: "Wenn man keine Ahnung hat, einfach mal die Fresse halten!" :)
 
Code:
buf[rc] = '\0';
sowas solltest du bei "Exes" vermeiden ! Exes könne an viele stellen Nullen haben also bringt das gar nichts ! Schau mal mit nem HexEditor was den Die Datei für anfangs bytes hat. Schon Debuggt wieveile Daten werden empfangen ?

was ist buf und wie groß ist sizeof(buf)?

Code:
	for(int i = 0; i <= 1024; i++)
		buf[i] = 0;
Was ist das ?

Wieso benutzt du nicht FILE_ATTRIBUTE_NORMAL. Was für dateien willst du den Versenden

Kannst du bitte den kompletten code posten, vielleicht kann man dir dann helfen.

@Kachelator : führst du schon selbst gespräche ;)
 
Danke für die Antwort hier der code. Ich habe es jetzt doch mit FILE und fopen gemacht.
Server :
Code:
#include <windows.h>
#include <winsock2.h>
#include <iostream.h>

int startWinsock(void);

int main(void)
{
	char ctext[1024];
	long rc;
	char buf[1024];
	SOCKET acceptSocket;
	SOCKET connectedSocket;
	SOCKADDR_IN addr;
	FILE *f = fopen("ttt.exe", "w+b");

          rc = startWinsock();
	if(rc != 0)
	{
		printf("Fehler : startWinsock, fehler code : %d\n", rc);
		return 1;
	}
	else
	{
		printf("Winsock gestartet !\n");
	}

	acceptSocket = socket(AF_INET, SOCK_STREAM, 0);
	if(acceptSocket == INVALID_SOCKET)
	{
		printf("Fehler : Der Socket konnte nicht erstellt werden, fehler code : %d\n", WSAGetLastError());
		return 1;
	}
	else
	{
		printf("Socket erstellt !\n");
	}
	
	memset(&addr, 0, sizeof(SOCKADDR_IN));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(12345);
	addr.sin_addr.s_addr = ADDR_ANY;

	rc = bind(acceptSocket, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
	if(rc == SOCKET_ERROR)
	{
		printf("Fehler : bin , fehler code : %d\n", WSAGetLastError());
		return 1;
	}
	else
	{
		printf("Socket an port 12345 gebunden \n");
	}

	rc = listen(acceptSocket, 10);
	if(rc == SOCKET_ERROR)
	{
		printf("Fehler : listen, fehler code : %d\n", WSAGetLastError());
		return 1;
	}
	else
	{
		printf("acceptSocket ist im listen Modus....\n");
	}


	connectedSocket = accept(acceptSocket, NULL, NULL);


	rc = recv(connectedSocket, buf, sizeof(buf), 0);
	buf[rc] = '\0';
	fwrite(buf, rc, strlen(buf), f);

          fclose(f);
	return 0;

}

int startWinsock(void)
{
	WSADATA wsa;
	return WSAStartup(MAKEWORD(2, 0), &wsa);
}
Die ersten Byte der zu versendenen File sind ganz normal wie bei jeder exe
(in heximal)
Code:
-------------------
4d 5a 50 00 02 00 00 00 04 00 0f 00 ff ff 00 00 b8 00 00 00 00 00 00 00 40 00 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 ba 10 00 0e 1f b4 09 cd 21 b8 01 4c cd 21 90 90 54 68 69 73 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20 62 65 20 72 75 6e 20 75 6e 64 65 72 20 57 69 6e 33 32 0d 0a 24 37 00 00 00 00 00
------------------ 
for(int i = 0; i <= 1024; i++)
buf[i] = 0;

Das sollte eingentlich den Puffer reinigen :)
Den Client hab ich dran gehängt (sonst wird das hier zu groß ;))

mfg progX :p
 
Ich habe jetzt den Client nicht angesehen, nur einen kurzen Blick auf den Server geworfen.

recv und auch send machen NIE einen grossen (>16 KB glaube ich) Klotz auf einmal. Du kannst auch je nach Verbindungsqualität mehrere verschieden grosse Pakete erhalten. Bei kleinen bekommst du meistens alles in einem Rutsch (zumindest lokal).

Tip: Sende vor dem File die Grösse des Files, damit der Server weiss, wann die Datei fertig ist. Prüfe auch, ob send wirklich alles weggesendet hat, evtl. musst du nämlich Einzelteile nachreichen.

Du musst bei recv prüfen, wieviel Bytes jetzt angekommen sind, und dann solange weiter recv-en, bis wirklich das gesamte File da ist (oder die Verbindung weg). In deinem Beispiel speicherst du das erste Paket das ankommt, und beendest dann. Was ist, wenn da noch mehr kommt?
 
Zurück