Сокетное программирование: почему поведение recv () и read () не одинаково? - PullRequest
1 голос
/ 01 августа 2011

Я использую 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() не совпадает в моем коде?

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Поскольку recv() используется для сокетов, а не для общих файловых дескрипторов, таких как stdin.Сокеты могут рассматриваться как любой дескриптор, но дескрипторы не обязательно имеют сокет за ними (а в случае стандартного ввода - нет).

В этом конкретном фрагменте кода я подозреваю, что еслиВы проверяете errno, оно будет иметь значение EINVAL или подобное.

0 голосов
/ 28 февраля 2012

проверить справочную страницу: ssize_t recv(int sockfd, void *buf, size_t len, int flags);

...