Как мне воссоздать recv () с read ()? - PullRequest
0 голосов
/ 16 апреля 2019

Из-за требований спецификаций мне запрещено использовать recv () или аналогичные функции для чтения из fd сокета.Мне было интересно, как я мог бы переделать эту функцию, используя read ()?

Я пытался создать ее с помощью следующего кода

int recvFromFd(int connectionFd, char *buf, int size)
{
    char c;
    int i = 0;
    for (read(connectionFd, &c, 1); i < size; i++)
    {
        buf[i] = c;
        if (c == '\n' || read(connectionFd, &c, 1) == EOF)
            break;
    }
    return i;
}

Этот код работает до некоторой степени, но часто, когда когдаотправитель отправляет одно сообщение за другим, функция считывает оба этих сообщения одновременно в один и тот же буфер (добавляет).

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Так что я закончил тем, что сделал следующее, и это работает.

int recvFromFd(int connectionFd, char *buf, int size)
{
    char c;
    int i = 0;
    for (read(connectionFd, &c, 1); i < size && c != '\n'; i++)
    {
        buf[i] = c;
        read(connectionFd, &c, 1);
    }
    buf[i] = '\0';
    if (debugMode)
        printf("\n>Incoming from socket: %s\n", buf);
    return i; // how many was read
}
0 голосов
/ 16 апреля 2019

Вы можете использовать read (2) вместо recv (2) в Unix (но я не уверен, работает ли он в Windows, где нет функции read ()). Но функция read () имеет некоторые ограничения:

  1. Вы не можете получить адрес партнера (в случае протокола UDP);

  2. Вы не можете получать дейтаграммы нулевого размера (UDP);

  3. Нельзя передать файловые дескрипторы (через сокет домена unix);

  4. Вы не можете работать со специальными типами сокетов (домен AF_NETLINK, тип сокета SOCK_SEQPACKET), которые используются для получения конфигурации ядра из ядра.

Страница руководства Linux гласит:

Единственная разница между recv () и read (2) заключается в наличии флаги. С аргументом нулевого флага recv () обычно эквивалентно прочитать (2).

Как я думаю, для протокола TCP, где практически нет разницы в использовании read (2) или recv (2).

...