2013-12-04 3 views
0

Я хочу создать RCON-отправителя на C++ для многопользовательской игры Jedi Academy. Все работает нормально, только проблема в том, что, когда я читал recv() с сервера, заказ иногда не является подлинным!Ошибка C++ Socket recv()

std::vector<std::string> ReceiveLine() { 
    std::vector<std::string> ret; 
    char* r = new char[1024]; 

    int i = 0; 

    while (i < 40) { 
     for(unsigned int j=0; j<1024; ++j) r[j]=0; 
     if (recv(s_, r, 1024, 0) <= 12) { 
      break; 
     } 
     ret.push_back(r+10); 
     ++i; 
    } 
    return ret; 
} 

Он печатает так:

map: mp/ffa3 
num score ping name   lastmsg address    qport rate 
    4  0 0 Alora    33     bot 6145 16384 
    5  0 0 Alora    33     bot 22058 16384 
    6  0 0 Alora    33     bot 60636 16384 
    7  0 0 Alora    33     bot 18312 16384 
    8  0 0 Alora    33     bot 11812 16384 
--- ----- ---- --------------- ------- --------------------- ----- ----- 
    0  0 22 test     0 XX.XX.XXX.XXX:29070 65099 25000 
    1  0 0 Alora    33     bot 9234 16384 
    9  0 0 Alora    33     bot 27681 16384 
10  0 0 Alora    33     bot 19116 16384 
11  0 0 Alora    33     bot 3514 16384 
    2  1 0 Alora    33     bot 65099 16384 
12  0 0 Alora    33     bot 5972 16384 
    3  0 0 Alora    33     bot 41129 16384 
13  0 0 Alora    33     bot 30716 16384 

Это должно быть в порядке NUM (работает в PHP)

ответ

2

UDP не гарантирует доставку заказанного. Существует множество причин, по которым датаграмма может выйти из строя.

+0

Как PHP может привести к его упорядочению? – Iburidu

+0

Хотя это правда, и вам нужно справиться с этой ситуацией, я бы не ожидал, что они будут так плохо выведены из строя повторяющимся образом. Я подозреваю, что что-то еще не так, но не могу сказать из этого фрагмента кода. Являются ли пакеты вы возвращаете строки с нулевым завершением? Возможно ли, что вы смешиваете два разных потока? – mark

+0

да, это должно быть завершено нулем :) каждая строка выглядит как '\ xFF \ xFF \ xFF \ xFFprint [SOMETHING] \ n', а null до 1024. Socket:' s_ = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP) ; ' ' sockaddr_in addr; '' addr.sin_family = AF_INET; '' addr.sin_port = htons (port); '' addr.sin_addr = * ((in_addr *) he-> h_addr); 'memset (& addr.sin_zero), 0, 8); 'И connect:' :: connect (s_, (sockaddr *) & addr, sizeof (sockaddr)) 'Я использую только этот, так что я уверен, конфликтов нет , если вы имеете в виду это :) – Iburidu

Смежные вопросы