hallo!
ich möchte ein client und server programmieren. der client soll zum server eine mp3 datei schicken und der server soll diese auf der festplatte ablegen.
so sieht das im überblick beim server aus:
und so beim client:
es funktioniert alles eigentlich ganz gut, wenn ich eine textdatei verschicken lasse, gibts keine probleme, der inhalt ist 1:1wiederzufinden, aber sobald ich eine datei schicke die auch aus "unlesbaren zeichen" (wie zb in mp3 dateine vorhanden) besteht, kommen zwar genausoviele zeichen an und werden in die datei geschrieben, aber zb das abspielen der mp3 funktioniert nicht, da die zeichen nicht dieselben sind.
irgendeine idee wodran das liegt?
ich möchte ein client und server programmieren. der client soll zum server eine mp3 datei schicken und der server soll diese auf der festplatte ablegen.
so sieht das im überblick beim server aus:
Code:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
//Prototypen
int startWinsock(void);
int InitNetwork();
int CreateSocket();
int BindSocket();
int ListenSocket();
int AcceptSocket();
int SendData( char data[]);
int RecvData( char data[]);
int FCloseNetwork();
long rc;
SOCKET acceptSocket;
SOCKET connectedSocket;
SOCKADDR_IN addr;
int main()
{
InitNetwork();
CreateSocket();
BindSocket();
ListenSocket();
AcceptSocket();
// nun müssen wir connectedSocket zum übertragen von Daten benutzen
char bufferlength[256]; memset(bufferlength,'\0',256);
RecvData(bufferlength);
printf("Größe des nächsten String ist %s\n",bufferlength);
char *buffer = new char[atoi(bufferlength)];
memset(buffer,'\0',atoi(bufferlength));
RecvData(buffer);
char *temp = new char[atoi(bufferlength)];
memset(temp,'\0',atoi(bufferlength));
int c=0;
while( c < strlen(buffer))
{
temp[c]=buffer[c];
if( c > strlen(buffer)-5) temp[c]='\0';
c++;
}
FILE *f = fopen("empfangen.mp3","wb");
fwrite(temp,1,atoi(bufferlength),f);
fclose(f);
FCloseNetwork();
getch();
return 0;
}
int startWinsock(void)
{
WSADATA wsa;
return WSAStartup(MAKEWORD(2,0),&wsa);
}
int InitNetwork()
{
// Winsock starten
rc=startWinsock();
if(rc!=0)
{
printf("Fehler: startWinsock, fehler code: %d\n",rc);
return 1;
}
else
{
printf("Winsock gestartet!\n");
}
return 0;
}
int CreateSocket()
{
// Socket erstellen
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");
}
return 0;
}
int BindSocket()
{
memset(&addr,0,sizeof(SOCKADDR_IN));
addr.sin_family=AF_INET;
addr.sin_port=htons(12345);
addr.sin_addr.s_addr=INADDR_ANY;
rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
if(rc==SOCKET_ERROR)
{
printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Socket an port 12345 gebunden\n");
}
return 0;
}
int ListenSocket()
{
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");
}
return 0;
}
int AcceptSocket()
{
connectedSocket=accept(acceptSocket,NULL,NULL);
if(connectedSocket==INVALID_SOCKET)
{
printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Neue Verbindung wurde akzeptiert!\n");
}
return 0;
}
int SendData( char data[])
{
char len[256];
itoa(strlen(data),len,10);
send( connectedSocket, len,256,0);
send( connectedSocket, data, strlen(data), 0);
return 0;
}
int RecvData( char data[])
{
char len[256];
recv(connectedSocket, len, 256,0);
recv(connectedSocket, data, atoi(len),0);
return 0;
}
int FCloseNetwork()
{
closesocket(acceptSocket);
closesocket(connectedSocket);
WSACleanup();
return 0;
}
und so beim client:
Code:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <fcntl.h>
//Prototypen
int startWinsock(void);
int InitNetwork();
int ClCreateSocket();
int ConnectToServer(char IPAdress[]);
int SendData( char data[]);
int RecvData( char data[]);
int FCloseNetwork();
long rc;
SOCKET s;
SOCKADDR_IN addr;
int main()
{
InitNetwork();
ClCreateSocket();
ConnectToServer("127.0.0.1");
unsigned int nbytes=0, bytesread=0;
nbytes = _filelength( fileno(fopen("C:\\test.mp3","rb")));
int fh1= _open("C:\\test.mp3", _O_RDONLY | _O_BINARY);
if( fh1 == -1 )
{
printf("C:\\test.mp3 konnte nicht geöffnet werden.\n");
getch();
return 1;
}
char *buffer = new char[nbytes];
if( ( bytesread = _read( fh1, buffer, nbytes ) ) <= 0 )
{
printf("Datei konnte nicht gelesen werden.\n" );
getch();
return 1;
}
char bufferlength[256];
memset(bufferlength,'\0',256);
_itoa( bytesread, bufferlength, 10);
printf( "Größe %s\n", bufferlength);
SendData(bufferlength);
SendData(buffer);
FCloseNetwork();
getch();
return 0;
}
int startWinsock(void)
{
WSADATA wsa;
return WSAStartup(MAKEWORD(2,0),&wsa);
}
int InitNetwork()
{
// Winsock starten
rc=startWinsock();
if(rc!=0)
{
printf("Fehler: startWinsock, fehler code: %d\n",rc);
return 1;
}
else
{
printf("Winsock gestartet!\n");
}
return 0;
}
int ClCreateSocket()
{
s=socket(AF_INET,SOCK_STREAM,0);
if(s==INVALID_SOCKET)
{
printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Socket erstellt!\n");
}
return 0;
}
int ConnectToServer(char IPAdress[])
{
memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
addr.sin_family=AF_INET;
addr.sin_port=htons(12345); // wir verwenden mal port 12345
addr.sin_addr.s_addr=inet_addr( IPAdress); // zielrechner ist unser eigener
rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
if(rc==SOCKET_ERROR)
{
printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Verbunden mit %s..\n",IPAdress);
}
return 0;
}
int SendData( char data[])
{
char len[256];
itoa(strlen(data),len,10);
send( s, len,256,0);
send( s, data, strlen(data), 0);
return 0;
}
int RecvData( char data[])
{
char len[256];
recv(s, len, 256,0);
recv(s, data, atoi(len),0);
return 0;
}
int FCloseNetwork()
{
closesocket(s);
WSACleanup();
return 0;
}
es funktioniert alles eigentlich ganz gut, wenn ich eine textdatei verschicken lasse, gibts keine probleme, der inhalt ist 1:1wiederzufinden, aber sobald ich eine datei schicke die auch aus "unlesbaren zeichen" (wie zb in mp3 dateine vorhanden) besteht, kommen zwar genausoviele zeichen an und werden in die datei geschrieben, aber zb das abspielen der mp3 funktioniert nicht, da die zeichen nicht dieselben sind.
irgendeine idee wodran das liegt?