?
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
#pragma comment( lib, "ws2_32.lib" )
typedef struct NETFILEHEADER
{
unsigned long FileSize;
char pFileName[256];
};
long SendFileToNet(const char *pFileName,
const char *pIP,
unsigned short Port)
{
unsigned long FileSize;
char buffer[1024];
NETFILEHEADER FileHeader;
SOCKET sender;
WSADATA wsa;
SOCKADDR_IN addr;
int addrlen = sizeof(SOCKADDR_IN);
////////////// Datei zum Lesen öffnen //////////////////////////
ifstream datei(pFileName, ios::binary);
if (!datei) /* Fehler */
return 0;
////////////// Dateigrösse bestimmen ///////////////////////////
in_file.seekg (0, ios::end);
FileSize = in_file.tellg();
in_file.seekg (0, ios::beg);
/////////////// NETFILEHEADER initialisieren ///////////////////
FileHeader.FileSize = FileSize;
memset(FileHeader.pFileName, 0, 256);
memcpy(FileHeader.pFileName, pFileName, strlen(pFileName));
////////////// Winsock initialisieren //////////////////////////
WSAStartup(MAKEWORD(2,0),&wsa);
sender = socket(AF_INET, SOCK_STREAM, 0);
memset(&addr, 0, sizeof(SOCKADDR_IN));
addr.sin_family = AF_INET;
addr.sin_port = htons(Port);
addr.sin_addr.s_addr = inet_addr(pIP);
connect(sender, (SOCKADDR*)&addr, addrlen);
/////////////////// NETFILEHEADER senden ////////////////////////
send(sender, (char*)&FileHeader, sizeof(NETFILEHEADER), 0);
/////////////////// Datei senden ////////////////////////////////
while(FileSize >= 1024)
{
in_file.read(buf, 1024);
send(sock, buf, stream.gcount(), 0);
FileSize -= 1024;
}
if(FileSize)
{
in_file.read(buffer, FileSize);
send(sock, buffer, stream.gcount(), 0);
}
/////////////////// Winsock schließen //////////////////////////
closesocket(sender);
datei.close();
WSACleanup();
return FileSize;
}
long GetFileFromNet(unsigned short Port)
{
SOCKET server;
SOCKET client;
WSADATA wsa;
SOCKADDR_IN addr;
char buffer[1024];
long rval;
FILE *pFile;
NETFILEHEADER FileHeader;
long FileSize;
////////////// Winsock initialisieren //////////////////////////
int addrlen = sizeof(SOCKADDR_IN);
WSAStartup(MAKEWORD(2,0),&wsa);
server = socket(AF_INET, SOCK_STREAM, 0);
memset(&addr, 0, sizeof(SOCKADDR_IN));
addr.sin_family = AF_INET;
addr.sin_port = htons(Port);
addr.sin_addr.s_addr = INADDR_ANY;
bind(server, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
listen(server, 10);
client = accept(server, (SOCKADDR*)&addr, &addrlen);
/////////////////// NETFILEHEADER empfangen /////////////////////
char *FileHeader1 = new(char[sizeof(Netfileheader)];
unsigned long AlreadyReceived = 0
unsigned long rc = 0;
char* p = Fileheader1;
do
{
rc = recv(client, p, sizeof(NETFILEHEADER)-AlreadyReceived, 0);
AlreadyReceived += rc;
p += rc;
}while(AlreadyReceived<sizeof(NETFILEHEADER));
memcopy(FileHeader1, Netfileheader, sizeof(NETFILEHEADER));
FileSize = FileHeader.FileSize;
/////////////////// Datei empfangen /////////////////////////////
ofstream datei(FileHeader.pFileName,ofstream::binary);
// In Datei schreiben
while(FileSize > 0)
{
rval = recv(client, buffer, 1024, 0);
out_file.write(buf,sizeof(buf));
FileSize -= rc;
}
/////////////////// Winsock schließen //////////////////////////
datei.close();
closesocket(client);
closesocket(server);
WSACleanup();
return FileHeader.FileSize;
}
void main(void)
{
// server: SendFileToNet("net.cpp", "192.168.0.1", 80);
// client: GetFileFromNet(80);
}
hi, ich hab da mal streams eingebaut!
kann man für den char Buffer auch std::string nehmen fürs send:
send(sock, buf.c_str(), stream.gcount(), 0);
funzt das:
ifstream datei(pFileName, ios::binary);
verlagt da der 1 param. const char *FileName ??? will da auch lieber std::string nehmen...
beim emfangen des NETFILEHEADER, wie könnte man das besser machen?
cu