2017-12-03 9 views
-1

장치간에 연결에 TCP 소켓을 사용하고 있습니다. 나는 연결의 1면 (서버 쪽)을 닫습니다. 내가 setsockopt 및 제한 시간을 사용하고 있습니다. 클라이언트 소켓에 대한 Aread 호출은이 경우 내 이해에 따라 -1을 반환해야합니다. 하지만 0을 돌려주고 있습니다. 수정할 필요가있는 항목이 있습니까? 아래에 클라이언트 코드 붙여 넣기.setsockopt 사용하기; read는 0을 반환하지 않습니다. 소켓이 다른 쪽에서 닫힌 경우

void* socketClientLoop(void* arg) 

{ 
    //struct socketArgs* sockArg = (struct socketArgs *)arg; 
    char server_address[20] , *strtokResult; 
    strcpy(server_address,"192.168.43.217"/*sockArg->server_address*/); 
    printf("\nsocket : server address in clientLoop = %s\n",server_address); 
    struct sockaddr_in addr = { 0 }; 
    int s, status, distance; 
    int distanceFromSocket = 0;//sockArg->distance; 
    char gpsMessage[128], dist[16]; 
    int flag = true, writeFlag = false; 

    struct timeval tv; 

    while(true) 
    { 
     printf("socket : loop started\n"); 

     flag = true; 
     // allocate a socket 
     printf("socket : loop started1\n"); 
     s = socket(AF_INET, SOCK_STREAM, 0); 
     printf("socket : loop started2\n"); 

     if(s<0) perror("socket error in client loop"); 

     // set the connection parameters (who to connect to) 
     addr.sin_family = AF_INET; 
     addr.sin_port = htons(5000); 
     if(inet_pton(AF_INET, server_address, &addr.sin_addr)<=0) 
     { 
      printf("\n socket : inet_pton error occured\n"); 
      return 0; 
     } 


     tv.tv_sec = 15; // 30 seconds 
     tv.tv_usec = 0; // microsecs, set to 0 (or ...) 
     setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv,sizeof(struct timeval)); 

     // connect to server 
     status = connect(s, (struct sockaddr *)&addr, sizeof(addr)); 

     if(status<0) perror("socket status error in client loop"); 

     // send a message 
     if(status == 0) { 
      while(flag) 
      { 
       sleep(5); 
       memset(gpsMessage,0,sizeof(gpsMessage)); 
       status = read(s,gpsMessage, 128); 
       if(!strncmp(gpsMessage,"connected",9)) writeFlag = true; 
       else writeFlag = false; 
       strtokResult = strtok(gpsMessage,":"); 
       if(strtokResult) 
       { 
        strtokResult = strtok(0,":"); 
        if(strtokResult) 
        { 
         strcpy(dist,strtokResult); 
         sscanf(dist,"%d",&distance); 
        } 
       } 
       printf("dist = %d\n", distance); 
       printf("socket : clientLoop did not exited\n"); 
       if(distance == 2*distanceFromSocket) 
       { 
        /*pthread_mutex_lock(&fill_mutex); 
        pthread_cond_signal(&cond_var); 
        pthread_mutex_unlock(&fill_mutex);*/ 
       } 
       if(writeFlag) 
       { 
        socketPrepareMessageToSend(gpsMessage); 
        status = write(s,gpsMessage , strlen(gpsMessage)); 
        //if(status < 0) flag=false; 
       } 
       //strcpy(gpsMessage,"No Ring"); 
       status = read(s,gpsMessage, 128); 
       printf("bytes_read %d \n",status); 
       if(status < 0) 
       { 
        printf("set loopflag\n"); 
        flag=false; 
        writeFlag=false; 
       } 
       else 
       { 
        writeFlag=true; 
        printf("ring no ring = %s\n",gpsMessage); 
        if(!strcmp(gpsMessage,"Ring")) 
        { 
         printf("SOCKET RING\n"); 
         system("espeak -ven+f3 -k5 -s150 \"I've just picked up a fault in the AE35 unit\""); 
        } 
        else printf("wrongoption\n"); 
       } 
      } 
     } 

     if(status < 0) perror("uh oh"); 
     printf("socket : clientLoop exited\n"); 
     close(s); 
     printf("socket : end of loop\n"); 
    } 
} 

답변

2

는 소켓이 다른 측면에서 폐쇄되면 파일 끝을 표시하고, 읽기 호출 올바른 동작입니다 0 돌려주는 것입니다.

참조 : https://linux.die.net/man/2/read