c - 使用 setsockopt;当套接字从另一端关闭时,read 返回 0 而不是 -1

标签 c linux sockets tcp

<分区>

我正在使用 TCP 套接字在设备之间进行连接。我关闭连接的一侧 - 服务器端。我正在使用 setsockopt 和超时。根据我的理解,在这种情况下,客户端套接字上的 Aread 调用应该返回 -1。但它返回 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");
    }
}

最佳答案

当套接字从另一端关闭时,它表示文件结束,读取调用将返回 0。正确的行为。

引用: https://linux.die.net/man/2/read

关于c - 使用 setsockopt;当套接字从另一端关闭时,read 返回 0 而不是 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47618949/

相关文章:

linux - ApacheBench 结果到文件

c - 为什么 select() 函数在我的 UDP 服务器实现中总是返回 0?

php - PHP多连接套接字(广播问题)

java - 了解 Android 的代码 fragment IP 摄像机

c - 尝试为 STM32 构建自定义 micropython 固件时出现问题

c - 是什么导致该程序出现段错误?

c - C中常量的内存地址

Linux 和 Primesense

c - 段错误 ||使用c进行字符串操作

php - Phalcon在Centos上安装报错: make: *** [phalcon. lo] Error 1