C++ recv() zawsze odbiera 0 bajtów

0

witam.
Mam serwer napisan w c++ (no jest na wykończeniu). Od jakiegoś czasu mam problem którego wcześniej nie było. Mianowicie pisząc serwer dostawałem dane. Czasem śmieci czasem nie ale zawsze coś dostałem. Teraz natomiast zawsze dostaję zero bajtów przy odbieraniu danych. Odbieram je tak:
if((somesize = recv(newfd,buffer,1240,0)) <= 0 ) ...

somesize == 0 tylko wtedy kiedy druga strona (w moim przypadku klient) zakończy połączenie. Niestety u mnie klient nie zamyka połączenia a i tak dostaję zero bajtów.

W zasadzie przy samej komunikacji nie grzebałem od czasu pisania nowych rzeczy niekoniecznie wiedząc których. Kodu całego nie bardzo mogę co prawda pokazać. Ale jakby ktoś był zainteresowany pomocą to kod mogę udostępnić osobiście.

0

if((somesize = recv(newfd,buffer,1240,0)) <= 0 )
serio ? co jest dalej po tym ifie ??
masz warunek <= 0 czyli sądzę, że kończysz połączenie, a Ty napisałeś że tak odbierasz

0

ee w zasadzie mogłem więcej napisać.
To tak myślę że ten fragment powinien wystarczyć. Zaczyna się konstruktor klasy a potem metoda główna zaczyna obroty pętli głównej:
[code]
FD_ZERO(& master); // wyczyść główny i pomocniczy zestaw
FD_ZERO(& read_fds);

// utwórz gniazdo nasłuchująceo
if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    exit(1);
}

// zgub wkurzający komunikat błędu "address already in use"
if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, & yes,
        sizeof ( int)) == -1) {
    perror("setsockopt");
    exit(1);
}

// bind
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = INADDR_ANY;
myaddr.sin_port = htons(PORT);
memset(&(myaddr.sin_zero), '\0', 8);
if (bind(listener, (struct sockaddr *) & myaddr, sizeof ( myaddr)) == -1) {
    perror("bind");
    exit(1);
}

// listen
if (listen(listener, 10) == -1) {
    perror("listen");
    exit(1);
}

// dodaj gniazdo nasłuchujące do głównego zestawu
FD_SET(listener, & master);

// śledź najwyższy numer deskryptora pliku
fdmax = listener; // póki co, ten jest największy

}

void Socket::start() {
std::cout << "MAIN METHOD" << std::endl;
// FOREVER
while (true) {
std::cout << "main loop: "<< std::endl;
read_fds = master; // copy it
if (select(fdmax + 1, & read_fds, NULL, NULL, NULL) == -1) {
perror("select");
exit(1);
}
printf("Select was catch activity\n");

    // przejdź przez obecne połączenia szukając danych do odczytania
    for (i = 0; i <= fdmax; i++) {
        
         fcntl(i,F_SETFL,O_NONBLOCK);
    //std::cout << "here" << std::endl;
        
        if (FD_ISSET(i, & read_fds)) { // mamy jednego!!

#ifdef _DEBUG
printf("we've got one\n");
#endif
if (i == listener) {
// obsłuż nowe połączenie
addrlen = sizeof ( remoteaddr);
if ((newfd = accept(listener, (struct sockaddr ) & remoteaddr,
& addrlen)) == -1) {
perror("accept");
} else {
FD_SET(newfd, & master); // dodaj do głównego zestawu
if (newfd > fdmax) { // śledź maksymalny
fdmax = newfd;
}
/

* WYSLAC LISTE KANALOW
/
int somesize ;
unsigned char * buffer = new unsigned char [120];
if((somesize = recv(newfd,buffer,1240,0)) <= 0 ) //don't receive dataas
perror("hash");
printf("%d receivrd %d bytes while getting the hash\n",newfd,nbytes);
[/code]
no i zawsze mam zero bajtow cokolwiek bym nie wyslal.
Mój program testujący jest w javie ale to nie powinno mieć znaczenia żadnego. Oto jego kod:
[code]
/

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package aaa;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
*

  • @Author mlody
    */
    public class Aaa {

    /**

    • @param args the command line arguments
      */
      public static void main(String[] args) {
      InetAddress serverAddr = null;
      // String txt = "";
      ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(); //to musi być |
      DataOutputStream out = null; //to musi być | wynika z założenia projektu
      try{
      out = new DataOutputStream(byteOutput);
      }catch(Exception e){}
      String buffer = "";
      try {
      serverAddr = InetAddress.getByName("klopucki.pl");
      } catch (UnknownHostException ex) {
      Logger.getLogger(Aaa.class.getName()).log(Level.SEVERE, null, ex);
      }
      Socket sock = null;
      try {
      sock = new Socket(serverAddr, 8080);
      //Log.d("con","polaczono");
      } catch (IOException ex) {
      Logger.getLogger(Aaa.class.getName()).log(Level.SEVERE, null, ex);
      }
      try {
      //out.writeUTF("d4aefe955ab32f25fc333927ab6c5f38");
      out.writeInt(3);
      } catch (IOException ex) {
      Logger.getLogger(Aaa.class.getName()).log(Level.SEVERE, null, ex);
      }
      try {
      out.flush();
      } catch (IOException ex) {
      Logger.getLogger(Aaa.class.getName()).log(Level.SEVERE, null, ex);
      }
      try {
      //Log.d("buf","wyslano do bufora");
      sock.getOutputStream().write(byteOutput.toByteArray());
      } catch (IOException ex) {
      Logger.getLogger(Aaa.class.getName()).log(Level.SEVERE, null, ex);
      }
      try {
      sock.getOutputStream().flush();
      //Log.d("buf","wyslano buffor");
      } catch (IOException ex) {
      Logger.getLogger(Aaa.class.getName()).log(Level.SEVERE, null, ex);
      }
      try {
      Thread.currentThread().sleep(5000);
      } catch (InterruptedException ex) {
      Logger.getLogger(Aaa.class.getName()).log(Level.SEVERE, null, ex);
      }
      try {
      sock.close();
      //Log.d("con","zamknieto polaczenie");
      } catch (IOException ex) {
      Logger.getLogger(Aaa.class.getName()).log(Level.SEVERE, null, ex);
      }
      // try {
      // sock.shutdownOutput();
      // sock.shutdownInput();
      // } catch (IOException ex) {
      // Logger.getLogger(Aaa.class.getName()).log(Level.SEVERE, null, ex);
      // }

    }
    }
    [/code]

0
unsigned char * buffer = new unsigned char [120]; // dlaczego na stercie?
						
if((somesize = recv(newfd, buffer, 1240, 0)) <= 0 )    // próbujesz czytać 1240 bajty do bufora 120-bajtowego. Prosisz się o problemy.
    perror("hash");

printf("%d receivrd %d bytes while getting the hash\n", newfd, nbytes); // co to jest 'nbytes'?

Jeśli to "zawsze dostaję zero bajtów" opierasz na tym, co wyświetli printf, to myślę, że już powinieneś się domyśleć skąd to zero.

p.s. z tą drabinką try...catch w kodzie javowym przesadziłeś. Nie da się tego czytać...

0
0x666 napisał(a):
unsigned char * buffer = new unsigned char [120]; // dlaczego na stercie?
						
if((somesize = recv(newfd, buffer, 1240, 0)) <= 0 )    // próbujesz czytać 1240 bajty do bufora 120-bajtowego. Prosisz się o problemy.
    perror("hash");

printf("%d receivrd %d bytes while getting the hash\n", newfd, nbytes); // co to jest 'nbytes'?

Jeśli to "zawsze dostaję zero bajtów" opierasz na tym, co wyświetli printf, to myślę, że już powinieneś się domyśleć skąd to zero.

p.s. z tą drabinką try...catch w kodzie javowym przesadziłeś. Nie da się tego czytać...

NO java tak przesadziłem ale to tylko dlatego żeby ewentualny wyjątek wyłapać i wykluczyć błędy po stronie serwera. Fakt ten printf był przeoczeniam. Już działa.
Dzięki i pozdrawiam.

0

A to nie można objąć całego kodu jednym try...catch:

try 
{
	out = new DataOutputStream(byteOutput);
	...
	
	sock.close();
} 
catch (IOException ex) 
{
	Logger.getLogger(Aaa.class.getName()).log(Level.SEVERE, null, ex);
}

?

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