2017-05-19 1 views
0

Quelqu'un peut-il expliquer pourquoi, par exemple, ce printf n'est pas exécuté avant d'avoir appelé la fonction ConnectionSocket()?Blocage d'un socket UDP C

Je sais que les sockets bloquent par défaut, donc il attend jusqu'à ce qu'il reçoive quelque chose. Mais la fonction à ce moment-là n'est pas encore exécutée, pourquoi n'imprime-t-elle pas d'abord "test" sur l'écran?

#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <string.h> 
#include <stdlib.h> 
#include <wiringPi.h> 
#include <stdbool.h> 
#include <sys/time.h> 
/* Global variables */ 
unsigned char buffer[1]; 
struct sockaddr_in serverAddr, clientAddr; 
struct timeval timeout={10,0}; //set timeout for 10 seconds 
int udpSocket, slen = sizeof(clientAddr); 


int main(){ 
    printf("test"); // -> for the first time executed when receiving a byte 
    initialize_pins(); 
    ConnectionSocket(); 
    loop(); 

    return 0; 
} 

void ConnectionSocket(){ 

    /*Create UDP socket*/ 
    udpSocket = socket(AF_INET, SOCK_DGRAM, 0); 

    /*Configure settings in address struct*/ 
    serverAddr.sin_family = AF_INET; 
    serverAddr.sin_port = htons(7891); 
    serverAddr.sin_addr.s_addr = inet_addr("192.168.0.184"); 
    memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); 

    /* set receive UDP message timeout */ 
    setsockopt(buffer,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(struct timeval)); 

    bind(udpSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); 

} 
+1

juste pour le test, essayez d'utiliser 'printf ("test \ n");' –

+0

qui fonctionne, mais pourquoi ça ne marche pas sans la nouvelle ligne? Et ne fonctionne qu'après avoir reçu mon premier octet. – stickfigure4

+0

Comment pouvez-vous dire que ce n'est pas? –

Répondre

1

printf() stocke la chaîne que vous voulez écrire dans un tampon, et le tampon sera imprimé à l'écran si elle est pleine, ou si un « \ n » est inséré ou si vous appelez fflush (), ou si une fonction standard appelle fflush() ou si la fin du programme est atteinte.

J'ai écrit un exemple avec write() qui imprime directement sur l'écran.

#include <stdio.h> 
#include <unistd.h> 

int  main(void) 
{ 
    printf("1");     // stored in a buffer but not printed on screen 
    write(STDOUT_FILENO, "2", 1); // directly printed on screen (2) 
    printf("3");     // stored in a buffer but not printed on screen 
    write(STDOUT_FILENO, "4", 1); // directly printed on screen (4) 
    fflush(stdout);     // flushing stdout, 1 and 3 are printed 
    write(STDOUT_FILENO, "5", 1); // directly printed on screen (5) 
    printf("6\n");     // stored in a buffer then the buffer is printed on the screen because of '\n' (6\n) 
    printf("7");     // stored in a buffer but not printed on screen 

    return (0);      // end of the program, 7 is printed 
} 

La sortie est 241356 \ n7

+0

Je comprends, mais pourquoi n'est-ce pas nécessaire quand par exemple faire un printf() dans la fonction principale, sans autres lignes de code. – stickfigure4

+0

Parce que le tampon de printf est imprimé sur l'écran à la fin du programme (s'il y a quelque chose à imprimer). J'ai ajouté un exemple :) – Gam

+0

Merci beaucoup! à cause de votre exemple, c'est très clair maintenant. Mais ce que je voulais mentionner est, sur mon Raspberry Pi par exemple qui est Linux, il ne l'imprimera en effet quand un nouveau caractère de ligne est présent, ou stdout est vidé ou à la fin du programme ofcourse. Mais dans les fenêtres (essayé en utilisant le studio visuel) il semble l'imprimer directement. Est-ce que cela se comporte différemment sur Windows? – stickfigure4