繁体   English   中英

C-app Socket,请勿在do-while中在read()之前执行printf()

[英]C - app Socket , not execute printf() before read() in do-while

当我运行服务器和客户端时,服务器“ accept()”客户端。 [printf 1] printf(已接受连接),并且在第二次未运行后运行[printf 2] printf(等待登录客户端)。 服务器仅在客户端向套接字写入[登录e密码]后才运行此行,为什么?

服务器

newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr,  &clilen);


 if (newsockfd < 0) 
      error("ERROR on accept");

printf("\nCONNECTION ACCEPTED");

do{
printf("\nWait login from client");  /*<----why this printf not run??*/
 bzero(buffer,256);
 d = read(newsockfd,buffer,255);
 if (d < 0) 
  error("ERROR reading from socket");
bzero(stringa,30);
strcat(stringa,buffer);

user = strtok(stringa,meno);
password = strtok(NULL,meno);


printf("\nUSER-> %s  PASSWORD -> %s\n",user,password);
bzero(risposta,10);
strcat(risposta,checkByUserPass(user,password));
if(strcmp(risposta,"OK")==0) 
    {
    printf("\n--------------TROVATO------------------risposta = %s---\n",risposta);
    d = write(newsockfd,"OK",18);




    }
else
    { 
    printf("\n--------------NON TROVATO IN ATTESA DI LOGIN VALIDO--------------risposta = %s---\n",risposta);
    d = write(newsockfd,"KO",18);





    }

}while(strcmp(risposta,"OK")!=0);

客户

 void error(char *msg)  


{  
 perror(msg);  
 exit(0);  
 }  
 int main(int argc,char *argv[])  
 {  
char u[20];
char p[10];
char meno[2]="-";
char input[10];
char servizio[10];


 int sockfd,portno,n,newsockfd;  
 struct sockaddr_in serv_addr;                              //struct sockaddr
 struct hostent *server;                                //hostent è una struttura definita su netdb.h e conterrà le 
                                            //informazioni sull'host, attraverso "struct hostent *gethostbyname(char *name);"


char buffer[256];  

    if(argc<3)                                      //se ci sono meno di 3 argomenti fallisce
    {  
    fprintf(stderr,"usage %s hostname port\n",argv[0]);  
    exit(0);  
    } 

 portno=atoi(argv[2]);                                  //il terzo argomento è il numero di porta
 sockfd=socket(AF_INET,SOCK_STREAM,0);                          //apriamo connessione di tipo socket socketfd descrittore

    if(sockfd<0)  
    {  
    error("error opening socket");  
    }  

 server=gethostbyname(argv[1]);                             //che prende un nome come attributo e restituisce una puntatore a una struttura 
                                            //di tipo hostent contenente le informazioni dell'host

    if(server==NULL)  
    {  
    fprintf(stderr,"error,no such host\n");  
    exit(0);  
    }  

 bzero((char*)&serv_addr,sizeof(serv_addr));                        //azzero il buffer server_addr
 serv_addr.sin_family=AF_INET;                              //compilo i campi 
 bcopy((char*)server->h_addr,(char*)&serv_addr.sin_addr.s_addr,server->h_length);   //uso void bcopy(char *s1,char *s2,int lenght) perchè server->h_addr è una stringa
 serv_addr.sin_port=htons(portno);                              //compilo campi struttura server_addr   

    if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)       //fase connect() prende 3 parametri : descrittore , indirizzo di memoria puntatore struct sockaddr, 
                                                //dimensione indirizzo
    {  
    error("error connecting");  
    }  

    bzero(buffer,256);                                      //azzero il buffer
/*----------PRENDERE USER E PASSWORD----------------------------*/
    printf("\nCONNESSIONE AVVENUTA COL SERVER.");
    do{
    printf("\nINSERIRE DATI PER IL LOGIN.");

        sleep(1);                               
    printf("\n\nEnter the user to insert : ");
    fgets(u,100,stdin);
    if (u[strlen(u) - 1] == '\n')       //rimuove lo /n generato dalla fgets
    {
    u[strlen(u) - 1] = '\0';
    }


    printf("\n\nEnter the passw to insert : ");
    scanf("%s",p);
    strcat(u,meno);
    strcat(u,p);

    bzero(buffer,256);
    strcat(buffer,u);
    printf("@debug-Messaggio da mandare -> %s", buffer);
    sleep(1);
    //bzero(u,20);
    n=write(sockfd,buffer,strlen(buffer));  

        if(n<0)  
        {  
        error("error writing to socket");  
        } 

        bzero(buffer,256);  
        n=read(sockfd,buffer,255);  

        if(n<0)  
        {  
        error("error reading rom socket");  
        }  
         else
        {   
        printf("server: %s",buffer);   
        //fputs(buffer, stdout);
        bzero(servizio,10);  
        strcat(servizio,buffer);   
        printf("\nservizio = ---%s---",servizio);   
        }  
        if (strcmp(servizio,"OK")==0)
        {
        printf("\n Login accettato");
        getchar();
        }
        else
        {
        printf("\n Conto non trovato");
        getchar();
        }
    }while(strcmp(servizio,"OK")!=0);

在打印文本的末尾添加一个\\n ,否则不能保证没有明显的模糊显示。 即:

printf("\nWait login from client\n");

要么:

printf("\nWait login from client");
fflush(stdout);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM