Wysłanie przez TCP 6 220 800 danych

0

Cześć.
Całego kodu nie będę wam dawać, ale mam taką tablicę:

char *sendtcp = (char*)bits;

Wypełnioną w 100%
Próbuję ją wysłać po tcp:

send(sock,sendtcp,6220800);

Na serwerze mam tablicę:

char* index = new char[6220800];

Do której przypisuję recv:

recv(sock,index,6220800,0);

Lecz każdy element jest równy 0 (a w kliencie nie)
Co robię źle?

0

A co zwracają funkcje? send i recv trzeba wywoływać w pętli.

0

wysyłaj po kawałku, 1 kB w pakiecie.

0

Mógł bym dostać jakieś podpowiedzi jak podzielić tą tablicę i wysłać w pakietach po 1kB?

0

coś w ten deseń (bez sprawdzania błędów podczas komunikacji):

char* p = sendtcp;
int left = 6220800;
while (left>0)
{
  int sent = send(sock,p,left);
  p += sent;
  left -= sent;
}
0

Spróbowałem coś takiego u klienta:

char* sendtcp = new char[1024];

    connect(sock, (sockaddr*)&saddr, sizeof(sockaddr));
    for (int x = 0; x < 6075; x++)
    {
        for (int i = 0; i < 1024; i++) sendtcp[i] = bits[(x*1024)+i];
        send(sock,sendtcp,1024,0);
    }
    closesocket(sock);

(bits to tablica typu unsigned char [ale zawiera same liczby od 0 do 255] która ma te 6220800 elementów)
Potem takie odbieranie na serwerze:

for (int x = 0; x < 6075; x++)
            {
                char* get = new char[1024];
                recv(sock,get,1024,0);
                for (int i = 0; i < 1024; i++) index[(x*1024)+i] = get[i];
            }
            FILE *f = fopen("C:\dump.raw", "wb");
            fwrite(index, 1, 1920*1080*3, f);
            fclose(f);

(tutaj index to ta duża tablica)

Jak na razie program ma przesłać bitmapę 1920x1080 i ją zapisać do pliku. Jakieś korekty żeby mój kod działał? Wydaje mi się, że raczej wszystko ok lecz na serwerze index to same 0, a u klienta to dobra bitmapa.

0

robisz blad ze niesprawdzasz co zwraca send/recv
tcp gwarantuje ci kolejnosc danych i ze dojda (niezniszczone)
ale niamasz gwarancji w jakich paczkach (po ile bajtow)

0

Czyli jak by powinien wyglądać ten kod? Nie za bardzo rozumiem.

0

@Odświeżam...

0
int size=1920*1080*3;
while(pos<size)
  {
   int ret=recv(sock,index+pos,size-pos,0);
   if(ret<0) break;
   else pos+=ret;
  }
if(pos<size) printf("coś nie tak\n");
else
  {
   FILE *f = fopen("C:\dump.raw", "wb");
   fwrite(index, 1, size, f);
   ...
0

Hmm a u klienta?

0

Analogicznie, rusz głową lub zamów gotowca.

0

No dobra mam tak u klienta:

char * buf = (char *)bits;
    int len = 1920*1080*3;
    int total = 0;
    int bytesleft = len;
    int n;
    while( total < len )
    {
        n = send( sock, buf + total, bytesleft, 0 );
        if( n == - 1 ) break;
        total += n;
        bytesleft -= n;
    }
    len = total;
    cout << (int)len << endl;

I potem odbieram na serwerze:

char* get = new char[1920*1080*3];
            for (int x = 0; x < 1920*1080*3; x++)
            {
                recv(sock,get,x,0);
            }
            bits = (unsigned char*)get;

Lecz w bits mam same zera. Co robię źle?

0
  1. Nie sprawdzasz co zwracają funkcje
  2. Odbieranie danych to jest WTF. Przeczytaj co zwraca funkcja recv i jakie przyjmuje argumenty. U ciebie działa to tak:

1 spróbuj odebrać 0 bajtów
2 spróbuj odebrać 1 bajt
3 spróbuj odebrać 2 bajty
.
.
.
192010803 spróbuj odebrać 192010803 - 1 bajtów

0

No to zgodnie z podpowiedzią zmieniam kod na podobny do kodu kolegi _13th_Dragon:

int pos = 0;
            int size = 1920*1080*3;
            while(pos<size)
            {
                int ret=recv(sock,get+pos,size-pos,0);
                if(ret<0) break;
                else pos+=ret;
            }
            if(pos<size) printf("coś nie tak\n");

Lecz wypisuje mi coś nie tak (jak również sprawdziłem pos jest równe 0).

1 użytkowników online, w tym zalogowanych: 0, gości: 1