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...