Je télécharge 6kB de données à partir d'un instrument de test connecté via socket TCP. J'utilise SOCK_STREAM:Je dois être en train de courir dans une limite de tampon quelque part recevoir des données du socket TCP en utilisant recv()
if((MySocket=socket(PF_INET,SOCK_STREAM,0))==-1) exit(1);
Je n'ai pas mis les I toutes les tailles de tampon, donc suppose que je suis sur ce que la valeur par défaut est. J'ai un problème avec la réception de données. Voici l'instruction:
if((recv(MySocket, &YRaw[indx], sizeChunk*2, 0))==-1)
{perror("recv()"); exit(9); } // where sizeChunk=3000; sizeof(YRaw[0])=2
où YRaw est un tableau d'objets 3000, chaque objet est de 2 octets. Le problème que j'observe après l'exécution du code, est celui d'environ les 3/4 de YRaw, il y a une chaîne de zéros, qui sont ce que j'ai initialisé le tableau. Il semble que la fonction de réception fonctionne bien jusqu'aux 3/4 de la matrice, puis saute un segment de la matrice YRaw (en laissant les valeurs initialisées), puis reprend à nouveau et la matrice YRaw se remplit. Il reste des données à lire dans le tampon, égal au nombre de valeurs ignorées dans le tableau YRaw. Je soupçonne que cela est lié à un peu de tampon dans le système. Quelqu'un peut-il faire la lumière sur la façon de résoudre ce problème?
Je ne sais pas si elle est liée, mais j'ai aussi mis TCP_NODELAY, ici:
// TCP_NODELAY option minimizes latency by instructing system to send small msgs immediately
// Insert setsockopt() before connect() occurs
int StateNODELAY = 1; // turn NODELAY on
if(setsockopt(MySocket, IPPROTO_TCP,TCP_NODELAY,
(void *) &StateNODELAY, sizeof StateNODELAY)==-1) {perror("setsockopt()"); exit(2); };
Meilleures salutations, GKK
Vous pouvez également utiliser l'indicateur WAITALL pour bloquer jusqu'à ce que toutes les données demandées aient été lues ou qu'une erreur se soit produite. –
Pourriez-vous décrire comment utiliser WAITALL. Cela semble prometteur ... quel fichier #include <___.h> ai-je besoin? A quoi ressemble un exemple de ligne de code? – ggkmath
Sous Linux, MSG_WAITALL est un indicateur optionnel, donné en tant que 4ème argument (c'est-à-dire au lieu du 0 dans votre appel recv) –