Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //struktura do przechowywania pakietow oczekujacych na obsluzenie
- struct WaitingPacket {
- sockaddr_in client; //adres klienta ktory przyslal pakiet
- unsigned char packet[12]; //pakiet ktory prztyslal klient
- };
- class Connection {
- //...
- std::queue<WaitingPacket>packetBuffor; //bufor pakietow przyslanych do serwera
- //...
- }
- //odbior danych
- void reciveData() {
- int addr_len = sizeof(struct sockaddr);
- WaitingPacket toQueue;
- while (true) {
- //zapisanie pakietu do zmiennej tymczasowej
- bytesRecv = recvfrom(mainSocket, (char*)toQueue.packet, sizeof(toQueue.packet), 0,
- (struct sockaddr *) &toQueue.client, &addr_len);
- packetBuffor.push(toQueue); //dodanie pakietu do bufora
- }
- }
- //przeslanie danych
- void sendData() {
- WaitingPacket fromBuffor;
- while (true) {
- //gdy jest jakis pakiet w buforze
- if (packetBuffor.size() > 0) {
- //pobranie danych z bufora
- fromBuffor = packetBuffor.front();
- packetBuffor.pop();
- //pobranie danych z pakietu
- packet.decodePacket(fromBuffor.packet);
- int status = packet.getStatus();
- //sprawdzenie poprawnosci id
- if (!checkId(packet.getId()) && status!=0) {
- status = 7; //blad id
- }
- std::cout << "Uzytkownik [" << packet.getId() << "] : ";
- //obsluga pakietu
- switch (status) {
- //obsluga pakietu
- }
- //jezeli nie czeka na kolejne liczby lub klient sie nie rozlaczyl, przeslij pakiet
- if (packet.getStatus() != 4 && packet.getStatus() != 9) {
- packet.getPacket(packetSent);
- bytesSent = sendto(mainSocket, (char*)packetSent, sizeof(packetSent), 0,
- (struct sockaddr *) & fromBuffor.client, sizeof(struct sockaddr));
- }
- }
- }
- }
- //tworzenie watku odbierania pakietow
- std::thread reciveThread() {
- return std::thread([this] { reciveData(); });
- }
- //tworzenie watku obslugi i wysylania pakietow
- std::thread sendThread() {
- return std::thread([this] { sendData(); });
- }
- };
- int main(int argc, char * argv[])
- {
- //utworz polaczenie
- Connection connection;
- connection.connect();
- //wlacz obsluge otrzymywania i wysylania pakietow
- std::thread t1 = connection.reciveThread();
- std::thread t2 = connection.sendThread();
- t1.join();
- t2.join();
- system("PAUSE");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement