`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)在套接字关闭时发送将失败.. 。 当然。没有什么可以发送给他们的。
我有一个 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)在套接字关闭时发送将失败.. 。 当然。没有什么可以发送给他们的。