NSOutputStream, comment générer correctement les données après que l'événement NSStreamEventHassPaceAvailable s'est écoulé?

StackOverflow https://stackoverflow.com/questions/6004467

Question

J'ajoute des messages que je souhaite envoyer à un serveur à une file d'attente:

typedef struct StreamOutputQueue{
    char message[513];
    struct StreamOutputQueue * next;
} StreamOutputQueue;

Lorsque j'obtiens l'événement nsStreamEventHasspaceAvAvable, j'envoie le premier message dans la file d'attente, puis le supprime pour que le message suivant soit prêt. Si la file d'attente est vide, je définis un drapeau afin que je puisse envoyer le message suivant immédiatement sans l'ajouter à la file d'attente car le flux est censé être prêt et la file d'attente est vide.

C'est le code après avoir obtenu l'événement:

case NSStreamEventHasSpaceAvailable:
            NSLog(@"Space Available!");
            if (login_start) { //Login
                range = [nick_field.text rangeOfString: @" "]; //Find space in nickname text
                if (range.location != NSNotFound) { //Found so include only the text up to the space.
                    used_nick = [nick_field.text substringToIndex: range.location];
                }else{ //Else include it all
                    used_nick = nick_field.text;
                }
                [irc_output_stream write:(const uint8_t *)[[NSString stringWithFormat:@"USER %@ * * :%@ \r\nNICK %@\r\n", used_nick, nick_field.text,used_nick,nil] UTF8String] maxLength:1024]; //Send USER and NICK IRC commands
                login_start = NO; //Login done.
            }else if (output_queue){ //Queue exists
                printf("OUTPUT QUEUE HAS DATA - %s\n",output_queue->message);
                [irc_output_stream write: (const uint8_t *)output_queue->message maxLength:512]; //Send message to server.
                StreamOutputQueue * next = output_queue->next;
                free(output_queue);
                output_queue = next; //Queue pointer points to next node.
                space_available = NO;
            }else{
                space_available = YES; //Nothing sent, space available for immediate data delivery to server. 
            }
            break;

La connexion fonctionne bien. Une fois la connexion terminée, le programme commence à utiliser la file d'attente pour envoyer des messages en cas de besoin.

Ici, le code qui ajoute des données à la fin de la file d'attente:

- (void) appendToOutputQueue: (char *) message{
    if (space_available) { //Space available with no queue so send the next one now.
        printf("SPACE AVAILABLE NO QUEUE - %s",message);
        [irc_output_stream write: (const uint8_t *)message maxLength:512];
        space_available = NO; //Wait until space is available again
        return; //Do not continue to add to queue
    }
    //Add to queue
    StreamOutputQueue * new;
    new = malloc(sizeof(*new)); //Allocate new node
    new->next = NULL; //Next must be null to signify end
    strcpy(new->message,message); //Copy message data
    if (output_queue) { //If the queue exists add the node to the end
        output_queue_end->next = new;
    }else{ //Else make the queue start at this node
        output_queue = new;
    }
    output_queue_end = new; //The end node is now this one
}

Le problème est que le serveur ne reconnaît pas les données qui sont envoyées dans la file d'attente. Les données sont imprimées correctement aux appels printf. La connexion fonctionne très bien. Il semble échouer à chaque fois si les données sont envoyées en dehors de la méthode de l'événement et échouent une partie du temps où il se trouve dans la méthode de l'événement où le serveur agira comme s'il avait des données corrompues.

Comment est-ce censé être fait?

Merci.

Était-ce utile?

La solution

Nécessaire pour supprimer const et j'ai ajouté strlen au maxLength.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top