Piszę sobię prosty programik do przesyłania plików. Na początek chciałem przesłać 1 "na sztywno" zadeklarowany plik *.jpg.
Serwer mam działający dobrze, sprawdzałem różnymi aplikacjami i działa. Odbiera dane i rozsyła do wszystkich połączonych klientów.
I na początku chciałem spróbować z 2 klientami:
Wysyłanie:
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#include <fstream.h>
#include <conio.h>
using namespace std;
int main()
{
WSAData wsa;
SOCKET s1;
struct sockaddr_in addr1;
char bufor[999999];
int addrlen;
fstream plik;
char *dane;
int dlugosc;
plik.open("obraz.jpg",ios::in|ios::binary);
plik.seekg(0,ios::end);
dlugosc=plik.tellg();
dane=new char[dlugosc];
plik.seekg(0,ios::beg);
plik.read(dane,dlugosc);
plik.close();
cout<<"Wczytalem plik"<<endl;
if(WSAStartup(MAKEWORD(2,0),&wsa)==SOCKET_ERROR)
{
cout<<WSAGetLastError()<<endl;
WSACleanup();
}
else
{
cout<<"WSA ready."<<endl;
}
s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct hostent *host;
host=gethostbyname("127.0.0.1");
memset( &addr1, 0, sizeof addr1 );
addr1.sin_family = AF_INET;
addr1.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;
addr1.sin_port = htons(1337);
if(connect(s1,(struct sockaddr *) &addr1, sizeof(addr1))==SOCKET_ERROR)
{
cout<<WSAGetLastError()<<endl;
WSACleanup();
}
else
{
cout<<"Connected"<<endl;
}
cout<<"wcisnij cos!"<<endl;
getch();
itoa(dlugosc,bufor,10);
send(s1,bufor,sizeof(bufor)+1,0);
send(s1,dane,dlugosc,0);
cout<<"Wyslalem plik"<<endl;
system("PAUSE");
return 0;
}
A Dobieranie tak:
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#include <fstream.h>
#include <cstdlib>
using namespace std;
int main()
{
WSAData wsa;
SOCKET s1;
struct sockaddr_in addr1;
char *bufor;
fstream plik2;
plik2.open("plik.jpg",ios::out|ios::binary);
int dlugosc;
if(WSAStartup(MAKEWORD(2,0),&wsa)==SOCKET_ERROR)
{
cout<<WSAGetLastError()<<endl;
WSACleanup();
}
else
{
cout<<"WSA ready."<<endl;
}
s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct hostent *host;
host=gethostbyname("127.0.0.1");
memset( &addr1, 0, sizeof addr1 );
addr1.sin_family = AF_INET;
addr1.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;
addr1.sin_port = htons(1337);
if(connect(s1,(struct sockaddr *) &addr1, sizeof(addr1))==SOCKET_ERROR)
{
cout<<WSAGetLastError()<<endl;
WSACleanup();
}
else
{
cout<<"Connected"<<endl;
}
recv(s1,buf,sizeof(buf)+1,0);
dlugosc=atoi(buf);
bufor=new char[dlugosc];
recv(s1,bufor,dlugosc,0);
plik2.write(bufor,dlugosc);
plik2.close();
cout<<"Zapisalem obraz"<<endl;
system("PAUSE");
return 0;
}
Problem w tym, że nie za bardzo mi to działa. Łącze się z serwerem, wielkość pliku wysyła się niby poprawnie, ale sam plik coś nie chce...
Wie ktoś gdzie leży błąd?
Wybaczcie tragiczny kod i brak wcięć :-/