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

问题描述 投票:-1回答:2

由于规范要求,我不允许使用recv()或类似的函数来读取socket的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;
}

此代码在某种程度上起作用,但通常当发送方一个接一个地发送一条消息时,该函数同时将这两条消息读取到同一个缓冲区(追加)。

c sockets recv low-level-io
2个回答
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()通常等效于read(2)。

我认为,对于TCP协议,使用read(2)或recv(2)几乎没有区别。


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
}
© www.soinside.com 2019 - 2024. All rights reserved.