如何使用read()重新创建recv()?

时间:2019-04-16 06:46:54

标签: c sockets recv low-level-io

由于规格要求,不允许使用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 :(得分:0)

您可以在Unix上使用read(2)代替recv(2)(但是我不确定它是否可以在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)几乎没有区别。

答案 1 :(得分:0)

所以我最终完成了以下工作,并且可以正常工作。

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
}