1

我用来select()从标准输入接收数据。

代码在这里:

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
int main()
{
    fd_set rfds;
    struct timeval tv;
    int retval;
    char buf[100];

    FD_ZERO(&rfds);
    FD_SET(STDIN_FILENO, &rfds);

    tv.tv_sec = 5;
    tv.tv_usec = 0;

    retval = select(1,&rfds,0,0,&tv);

    if( retval == -1)
        perror("select reset\n");
    else if(retval == 0)
        printf("timeout\n");
    else
    {
        printf("data available\n");
        if(FD_ISSET(STDIN_FILENO, &rfds))
        {
           //int ret = recv(STDIN_FILENO, buf, sizeof(buf), 0); // ret get -1.
           int ret = read(STDIN_FILENO, buf, sizeof(buf));       // ret get correct data. 
           printf("buf: %s ret: %d\n", buf,ret);            
        }
    }    
    return 0;
}

在这段代码中,recv()总是会返回-1,但read()可以得到正确的数据。

我发现这read()相当于recv()使用flags. 0那么为什么我的代码中的行为recv()read()不一样呢?

4

2 回答 2

1

因为recv()用于套接字,而不是标准输入等通用文件描述符。可以将套接字视为任何描述符,但描述符后面不一定有套接字(在标准输入的情况下,它们没有)。

在那段特定的代码中,我怀疑如果您检查errno它,它将具有EINVAL或类似的值。

于 2011-08-01T02:35:36.590 回答
0

查看手册页: ssize_t recv(int sockfd, void *buf, size_t len, int flags);

于 2012-02-28T07:47:45.740 回答