2017-12-03 4 views
-1

デバイス間を接続するためにTCPソケットを使用しています。私は接続の1側、つまりサーバー側を閉じます。私はsetsockoptとタイムアウトを使用しています。この場合、クライアントソケットのAread呼び出しは、私の理解に従って-1を返すはずです。しかし、それは0を返しています。変更する必要はありますか? 下記のクライアントコードを貼り付けます。;ソケットが他の側から閉じられたときに0を返さずに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

関連する問題