2010-12-03 41 views
0

J'ai un code:tampon pour la file d'attente question

une déclaration d'une file d'attente:

typedef deque<char*, allocator<char*> > CHARDEQUE; 
typedef queue<char*,CHARDEQUE> CHARQUEUE; 

CHARQUEUE p; 
size_t size_q; 
char recv_data[1024]; 

J'utilise un socket udp pour recevoir des données d'une machine distante:

c'est le boucle:

while (1) 
{ 
    bytes_read = recvfrom(sock,recv_data,1024,0, (struct sockaddr *)&client_addr, &addr_len); 

    p.push(recv_data); 
    size_q=p.size(); 
    printf("%d\n",size_q); 
} 

mais le problème est que je ne peux pas copier des données dans ma file d'attente qui est ce que je veux, je pourrais juste pointer t à cela ... quelqu'un peut-il aider à cela?

Pour plus d'informations, mon programme reçoit des données brutes, c'est pourquoi j'utilise char array .. des idées comment résoudre ce problème?

Répondre

2

Le problème est que vous êtes en train de pousser un "char *" qui est un pointeur dans votre file d'attente, pas les données réelles!

Utilisez un std::vector<char>, comme ci-dessous (pas de contrôle d'erreur, etc - que vous devriez faire btw.!):

std::deque<std::vector<char> > p; 


std::vector<char> read_buff; 

// per loop iteration 
read_buff.resize(1024); 
// read 
bytes_read = recvfrom(sock,&read_buff[0], 1024,0, (struct sockaddr *)&client_addr, &addr_len); 
// now resize to contents 
read_buff.resize(bytes_read); 

// push this 
p.push_back(read_buff); 
+0

Dans ce cas, il est probablement utile de faire le chèque pour éviter de pousser des vecteurs vides sur la file d'attente. –

+0

Pouvons-nous utiliser la file d'attente au lieu de dequeue ... et pourriez-vous me dire la différence entre eux? – fsidiosidi

+0

a 'std :: queue' est un wrapper autour d'un autre type de conteneur, et par défaut c'est un' std :: deque'. Si j'avais le choix, j'utiliserais 'std :: deque' directement - mais c'est ma préférence je suppose ... – Nim