recv()无法从网络

时间:2015-04-22 11:27:57

标签: c linux sockets tcp network-programming

我有一个典型的客户端服务器C套接字程序。

SERVER:
            if(ndp.cmd == 11)
            {   
                //ack1 = 0;
                puts("Query Command for Light 2");
                pthread_mutex_lock(&lock);  
                // ..Some critical stuff
                pthread_mutex_unlock(&lock);    
                printf("ID: %d, Level: %d\n", new.address, new.level);
                ack1 = new.level; //This result is showing correct on server
                ack1 = htonl(ack1);
                send(client_sock, &ack1, sizeof(ack1), 0);              
            }

CLIENT:
    printf("Query Actual level Light2\n");
    dp.id = 2;dp.cmd = 11; dp.active = 0; dp.level = 0; dp.group = 0; 
    if( send(sock , &dp , sizeof(dp) , 0) < 0) { puts("Send failed"); }
    sleep(1);
    ret = recv(sock , &level1 , sizeof(level1) , 0);
    printf("Number of bytes received: %d\n", ret); //Always gives 4
    fflush(stdout);
    printf("Light level %x\n", ntohl(level1) ); //This prints 0 (incorrect)
    fflush(stdout);
    sleep(5);


    printf("Query Actual level Light2\n");
    dp.id = 2;dp.cmd = 11; dp.active = 0; dp.level = 0; dp.group = 0; 
    if( send(sock , &dp , sizeof(dp) , 0) < 0) { puts("Send failed"); }
    sleep(1);
    ret = recv(sock , &level2 , sizeof(level2) , 0);
    printf("Number of bytes received: %d\n", ret); // Always gives 4
    fflush(stdout);
    printf("Light level %x\n", ntohl(level2) ); //This prints correct value
    fflush(stdout);
    close(sock);

Expected output:
Light level 32 (hex value for 50);
Light level 32

Actual output:
Light level 0
Light level 32

所以问题出在相同的请求上,客户端没有收到服务器的第一次发送,但是下一次recv()给出了正确的值。

为什么第一个recv()的数据会丢失,是否会被缓冲,也许我在第二个recv()中获得了之前的值?

请帮忙。

1 个答案:

答案 0 :(得分:0)

您可以使用 select / poll 机制来检查是否有新数据已到达套接字并等待正确读取。您还可以通过调用 <activity android:name=".Book" android:label="Shmira"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.shmira.shmira.MainActivity" /> </activity> 调用来检查已插入套接字的数据量,如下所示:

ioctl