Sockets dziwnie sie zachowuja (UDP - Linux i Windows)

0

Witam serdecznie..
Mam pewien problem z portami i UDP.
otóż stworzylem sobie klase np: MasterSocketClass ktora zawiera definicje laczenia sie i w ogóle ustawianie srodowiska (dziala na pewno).
nastepnie zrobilem sobie klase UDPSocket ktora dziedziczy funkcje z MasterSocketClass (oczywiscie dla UDP odpowiednio inicjije polaczenie (to tez jest bezblednie))..a UDP_Klient dziedziczy z UDPSocket a dodaje tylko operatorey << oraz >> i przechowuje zmienne: Addres, Port

Problem polega na tym ze dodalem sobie opeladowane operatory << oraz >> tak by sobie ulatwic..
Pakiet UDP wychodzi bezblednie nawet dostaje odpowiedz (sniffer) ale nie moge jej przechwycic..

UDP_Klient &UDP_Klient::operator<<(string &text) {
    sendTo(text.c_str(), text.length(), Adres, Port);
    return *this;
}

Adres - Adres docelowy
Port - Port Docelowy

a teraz operator >>

UDP_Klient& UDP_Klient::operator>>(string &text) throw(ErrorClass){
    string AdresNadawcy;
    PORT PortNadawcy;
    
    // ustawiam odpowiedni czas
    struct timeval czas;
    czas.tv_sec  = 1;
    czas.tv_usec = 500;
    
    // Ustawiam FileDestryptor jako socket ;-)
    fd_set ZrodloDanych;
    FD_ZERO(&ZrodloDanych);
    FD_SET(sockDesc, &ZrodloDanych);

    int temp;
    char buf[81];
    
    do {
       temp =  select(sockDesc+1, &ZrodloDanych, &ZrodloDanych, &ZrodloDanych, &czas);
       switch (temp) {
        case -1:     throw ErrorClass(BLAD_Select, "UDPKlient");
                     break;
        case  0:     break;                        // przeterminowanie
        default:     bzero(buf, 81);
                     recvFrom(buf, 80, AdresNadawcy, PortNadawcy);
                     if ((AdresNadawcy == Adres) && (PortNadawcy == Port))
                         text.append(buf,80);
                     break;
        };
    }while(temp);

    return *this;
}

Adres - Adres docelowy
Port - Port Docelowy
sockDesc - deskryptor portu

Oczywiscie nie wiem czy select jest dobrze (nie wiem jaki parametr ustawic jako pierwszy a z RTFM jest to najwyzszy deskryptor pliku +1
ale jesli go nie ma to program sie zawiesza jesli serwer nic nie odpowie (czeka w nieskonczonosc)
Moj sniffer widzi wyslany pakiet nastepnie ze serwer wysyla do mnie.. najlepsze jest to ze jesli nie zrobie tego przez clasy tylko np:

UDPSocket ABC;
ABC.sendTo("status", 6, Adres, Port);
char buf[81];
bzero(buf,81);
ABC.recvFrom(buf, 80, AdresZrodla, PortZrodla)

to wszystko dziala ale dostaje tylko 80 bajtow..
jak zrobic np jakas petla by wszystkie dane odbrac bo nie chce robic bufora 2048 znakow..

Pisze pod Linuxem a pod Windowsem kompiluje CygWinem (nie ma znaczenia tu i tu nie dziala i wszystko jest tak samo), a pod windowsem nie ma funkcji select ;-)

Zalezy mi na tych operatorach bo chce pozniej skozystac z polimorfizmu i zrobic jedna klase Service ktora bedzie jako TCP klient, UDP_Server, UDP_Client...

0

juz sie zarejestrowalem wiec moge latwiec pomagac i czekac na odpowiedz.. ;-) [!!!]

0

juz sobie poradzilem.... dodalem flage O_NONBLOCK do socketu:

  fcntl(sockDesc, F_SETFL, O_NONBLOCK);

i czas zmienilem na 1 sekundke przy select'cie i DZIALA !!!

[green] :d :)

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