007
01.04.2007, 21:56 Uhr
~kasdaf
Gast
|
Ja, die Methode öffnet die Datei als streamdatei und schickt sie dann über die send methode der sockets weg. allerdings mache ich defentiv am ende ein .close() auf die datei, womit alles wieder frei sein sollte.
Hier mal dei komplette Methode:
C++: |
int CCreateSocket::SendData(SOCKET sendSocket, char* buf, int flags) { char sendBuffer[SND_RCV_BUFFER_SIZE]; unsigned long totalSend = 0; unsigned long sizeOfFile = 0; unsigned long restToBeSend = 0; std::string fileName; /* Dateiendung */
/* Übliche Blöckgröße der zu sendenen Daten */ const unsigned long usualSizeToSend = SND_RCV_BUFFER_SIZE;
/* Größe der zu sendenen Datei ermitteln */ HANDLE hFile; DWORD dwFileSize; wchar_t buf_wide[SND_RCV_BUFFER_SIZE];
/* Größe des Dateinamen */ unsigned int sizeOfFileName = 0;
//Dateipfad in Unicode umsetzen und mit CreateFile Dateigröße ermitteln */ MultiByteToWideChar(CP_ACP, 0, buf, static_cast<int>(strlen(buf)+1), buf_wide, sizeof(buf_wide)/sizeof(buf_wide[0])); hFile = CreateFile(buf_wide, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
dwFileSize = GetFileSize(hFile, NULL);
/* Von DWORD nach ULONG schieben */ sizeOfFile = static_cast<unsigned long>(dwFileSize);
std::ifstream myFile(buf, std::ios::binary | std::ios::in);
if(myFile.is_open()) { /* Größe der Datei die gesendet werden soll vorraus schicken */ char * size = (char*) &sizeOfFile; send(sendSocket, size, sizeof(unsigned long), 0);
/* Dateiendung/Größe der Dateiendung - der Datei die gesendet wird vorraus schicken */ fileName = GetFileNameToSend(buf); sizeOfFileName = static_cast<unsigned int>(fileName.length()); size = (char*) &sizeOfFileName; send(sendSocket, size, sizeof(unsigned int), 0); send(sendSocket, fileName.c_str(), static_cast<unsigned int>(fileName.length()), 0); /* Dateiname */
/* Prüfen wegen Länge und EOF */ while(myFile.good()) { /*Exakte Anzahl an Bytes senden und nicht volle Buffergröße */ if(restToBeSend > SND_RCV_BUFFER_SIZE) { myFile.read(sendBuffer, usualSizeToSend); totalSend += send(sendSocket, sendBuffer, SND_RCV_BUFFER_SIZE, 0); } else if(restToBeSend > 0) { myFile.read(sendBuffer, restToBeSend); totalSend += send(sendSocket, sendBuffer, restToBeSend, 0); } else if(restToBeSend == 0) { /* Ggf. EOF feststellen */ myFile.read(sendBuffer, 1); if(myFile.eof()) break; totalSend += send(sendSocket, sendBuffer, 1, 0); }
restToBeSend = sizeOfFile - totalSend; } } myFile.close();
return totalSend; }
|
|