-1

由于规范要求,我不允许使用 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;
}

此代码在一定程度上有效,但通常当发送者一个接一个地发送一条消息时,该函数会同时将这两条消息读取到同一个缓冲区(追加)。

4

2 回答 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) 几乎没有区别。

于 2019-04-16T07:10:21.983 回答
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
}
于 2019-04-17T07:50:06.903 回答