abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 4
včera 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 22
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 3
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 1
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 2
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 770 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: UDP sockety thready, C++

Beda0 avatar 29.1.2014 20:00 Beda0 | skóre: 28
UDP sockety thready, C++
Přečteno: 259×

Zdravím.
mám třídu (Odesilatel), která má simulovat přístroj - posílá data po UDP na danou ip po daném portu - konkrétním na 127.0.0.1:2023

Druhá (Prijemce) třída přijímá data po UDP na danym portu (odkukoliv), zpracuje je (udělá z nich floaty) a uloží do bufferu.

Pokud je simulátor puštěnej z jinýho programu než příjemce, vše funguje. Pokud jsou puštěny z jednoho, tak se přijme jen 92 packetů, pak jich to 260 přeskočí (+- 20, tehnle počet se mění, ale 92 jich to přijme vždy a 93 už je posunutej) a pak to zase přijímá normálně - další stovky packetů (nebo to občas začne zase přeskakovat).

Odesilatel a příjemce jsou ve vlastních threadech. Wireshark říká, že odesilatel odešle data správně, při krokování je vidět, že příjemce je už v int size = read(socketDesc, data, 65535); dostane přeskonečené. Trápim se s tim celý den a nemam ponětí, co dělám špatně.

Pokud nepošlu 981bytů, ale míň, tak to funguje normálně (asi by to začlo přeskakovat někde dál), takže předpokldám, že se něco někam nevejde, ale nemůžu přijít na to co/kam. Vidíte v tom někdo nějakou botu?


Projemce p;
Odesilatel o;
o.start();
p.startReadData();
while(1){
   if(m.dataLength() > 0){
      Data<float> d = p.getData();
      for(int y = 0;y<d.length();y++)
         fprintf(outF,"%f;%f\n",...);//vypis dat do souboru  
   }
}
Prijemce:

Prijemce::Prijemce(){
   socketDesc = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
   sockaddr_in serverSock;
   serverSock.sin_family = AF_INET;
   serverSock.sin_addr.s_addr = htonl(INADDR_ANY);
   serverSock.sin_port = htons(2023);
   bind( socketDesc, (const sockaddr*) &serverSock, sizeof(serverSock) );
}
void Prijemce::startReadData(){
 th = new std::thread(&MeterUDP::readPackets,this);
}
Data<float> Prijemce:getData(){
   mutex.lock();
   Data<float> ret = dataBuffer;
   dataBuffer.clear();
   mutex.unlock();
   return ret;
}
void Prijemce::readPackets(){

ByteArray *bA;
   while(1){
      fd_set fds;
      timeval tv;
      FD_ZERO(&fds);
      FD_SET(socketDesc, &fds);
      tv.tv_sec = 1; 
      tv.tv_usec = 0;

      u8 data[65535];
      int test = 0;
      int ret = select(socketDesc+1, &fds, NULL, NULL, &tv); 
      if(ret == 1){
      int size = read(socketDesc, data, 65535);
      Bytes b;
      b.insert(b.end(),data,data+size);
      bA = new ByteArray(b);
      }
   }
   Data<float> dataBuffer = kouzla(bA);//konertuje ByteArray do pouzitelnyho formatu
}
Odesilatel:

Odesilatel::Odesilatel(){
   sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
   bzero(&serv_addr, sizeof(serv_addr));
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_port = htons(2023);
   net_aton("127.0.0.1", &serv_addr.sin_addr)
}
void Odesilatel::start(){
   th = new std::thread(&Odesilatel::sendData,this);
}
void Odesilatel::sendData(){
   while(1){
   u8 packet[981];
   for(int i = 0;i<981;i++)
      packet[i] = data;//tady naplnim data (ze souboru, ale to neni podstatny)
   sendto(sockfd, packet, 981, 0, (struct sockaddr*)&serv_addr, slen);
   }
}

Řešení dotazu:


Odpovědi

29.1.2014 20:17 Sten
Rozbalit Rozbalit vše Re: UDP sockety thready, C++
UDP je nezaručená komunikace, pakety nemusí dorazit nebo je může systém zahodit, protože je nečtete dostatečně rychle
Beda0 avatar 29.1.2014 21:25 Beda0 | skóre: 28
Rozbalit Rozbalit vše Re: UDP sockety thready, C++
Teď si připadám jako blb. Tohle mě napadlo už na začátku a skoušel jsem zpomlovat zápis pomocí usleep(...) ale bezvýsledně. Teď jsem dal natvrdo za každý odeslaný packet usleep a funguje to... ale nechápu, proč to ve dvou aplikacích stíhá zapisovat i číst, ale v jedné ne. Přitom thready se použití i se dvěma aplikacemi.
Aleš Janda avatar 29.1.2014 22:30 Aleš Janda | skóre: 21 | blog: kýblův blog | Kralupy nad Vltavou
Rozbalit Rozbalit vše Re: UDP sockety thready, C++
Zřejmě plánovač tvého jádra rozhazuje vlákna jinak, když je to jedna nebo více aplikací.

Je nějaký důvod, proč nepoužít TCP?
Beda0 avatar 30.1.2014 06:08 Beda0 | skóre: 28
Rozbalit Rozbalit vše Re: UDP sockety thready, C++
Simuluje to komunikaci s přístrojem, který posílá data po UDP - bude to fungovat pouze po velmi jednoduché lokální síti, většinou jen "síť" mezi dvěma zařízeními, takže ztrácení packetů po cestě nehrozí. Je požadovaná rychlost, TCP má zbytečně velkou režii, UDP prostě tlačí data na požadovaný port a ip a je jedno, jestli někdo ty packety chytá nebo ne, to s TCP nejde, protože je spojový.
30.1.2014 00:06 Sten
Rozbalit Rozbalit vše Re: UDP sockety thready, C++
Tipuji, že odesílatel stihne zapsat příliš mnoho paketů ještě předtím, než se příjemce stihne spustit. Zkuste spustit nejdříve příjemce.
Beda0 avatar 30.1.2014 06:16 Beda0 | skóre: 28
Rozbalit Rozbalit vše Re: UDP sockety thready, C++
Jo, tak teď si připadá jako úpnej blb. Tohle mě taky napadlo už na začátku, ale nevim, proč jsem to jen nepřehoadil a místo toho tam cpal nějaký usleep... prohodil jsem pořadí Odesilatel a Prijemce, vyhodil vsechny usleep a funguje to, díky.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.