`recvfrom` 函数可以用来检查是否有任何先前的数据发送到套接字?还是需要积极倾听?

Can the `recvfrom` function be used to check whether there have been any previous data sent to a socket? Or does it need to be actively listening?

我有一个 while(1) 循环,它使用 recvfrom 获取已从另一个进程 (P2) 发送到域套接字的数据。

while 循环需要做两件事,首先监听来自 P2 的传入数据,其次 运行 另一个函数 checkVoltage().

所以它 运行 有点像这样:

while(true)
{
    listenOnSocket() /*listens for 100 u seconds*/
    checkVoltage();
}

我的问题是:listenOnSocket() 函数使用 recvfrom 函数来检查来自另一个进程的输入。它花费 100usecs 监听,然后超时并继续执行 运行 checkVoltage() 函数。所以它花费了 99% 的时间在 listenOnSocket() 函数中。我的问题是,如果 P2 在 checkVoltage() 函数期间向套接字发送信息,则会导致错误,指出:sending datagram message: No such file or directory.

有没有办法让这个循环检查之前发送到套接字的任何数据?这样,如果 P2 在 checkVoltage() 函数期间发送数据,则不会导致错误。

谢谢。

编辑:

所以 listenOnSocket() 函数创建一个名称为 FireControl 的套接字,当我 运行 P1(从 P2 接收数据的程序)FireControl 文件消失时一瞬间又出现了。如果P2在这么短的时间内向P1发送数据,就会导致上面提到的错误。

所以我想这意味着我应该将套接字的创建与 recvfrom 函数分开,因为创建新套接字的短时间不存在 - 如果这有意义的话。

我是个笨蛋,早该分开了!

EDIT2:这里是 listenOnSocket():

command listenOnSocket(int timeout, float utimeout) /*Returns null payload when no input is detected*/
{
    command payload;
    int sock;
    socklen_t* length;
    struct sockaddr_un name;
    char buf[1024];

    struct timeval tv;
    tv.tv_sec = timeout;
    tv.tv_usec = utimeout;

    /* Create socket from which to read. */
    sock = socket(AF_UNIX, SOCK_DGRAM, 0);
    if (sock < 0) 
    {
        perror("opening datagram socket");
        payload = nullPayload;
    }

    /* Create name. */
    name.sun_family = AF_UNIX;
    strcpy(name.sun_path, NAME);

    unlink(name.sun_path);

    /* Bind the UNIX domain address to the created socket */
    if (bind(sock, (struct sockaddr *) &name, sizeof(struct sockaddr_un))) 
    {
        perror("binding name to datagram socket\n");
        payload = nullPayload;
    }

    /*Socket has been created at NAME*/
    if (timeout != 0 || utimeout != 0)
    {
        setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));
    }
    else
    {
        tv.tv_sec = 0;
        tv.tv_usec = 0;
        setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));
    }
    /* Read from the socket */
    if (recvfrom(sock, &payload, sizeof(command), 0, (struct sockaddr *)&name, &length) < 0) /*Less than zero results from a timeout*/
    {
        payload = nullPayload;
    }

    unlink(NAME);   
    return payload;
}

这是调用它的循环:

while (1)
    {
        buffer = getADCValue();

        checkVoltage();

        temp = listenOnSocket(0, 100); /*Look for a new command*/
        doStuffWithTempIfItHasChanged();
        }
    }

绑定套接字后,数据报将累积在缓冲区中,稍后可以使用 recvfrom 读取。也就是说,如果缓冲区溢出,消息可能会被丢弃。

I guess this means I should separate the creation of the socket from the recvfrom function, because the short period where the new socket is created it does not exist

没错。如果你每次在你的 listenOnSocket() 套接字中打开和关闭套接字,(a)你将丢失任何你没有阅读的排队的数据报,并且(b)在套接字关闭时发送将失败.. 。 当然。没有什么可以发送给他们的。