我有一对用C和Python编写的发送器/接收器代码。客户端正在生成数据并通过unix套接字将其发送给接收方。 Receiver并不总是在监听套接字,因为它应该对接收到的数据做一些事情。
在我当前的代码中,发件人发送的所有邮件都在队列中等待接收者接收,但我不想要这种行为。我希望发件人知道接收器现在很忙(甚至可能通过引发错误)。那么如何将接收器的队列长度设置为零呢?
请考虑我不希望发送或接收程序被阻止。
我的接收者和发送者代码部分是:
Receiver(在Python中):
self.app_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
self.app_socket.settimeout(0.01)
self.app_socket.bind(APP_SOCKET)
def poll(self, *args):
try:
message = self.app_socket.recv(1024)
except socket.timeout:
return
发件人(在C中):
int openSocket(char *path)
{
int sock;
struct sockaddr_un addr;
int size;
sock = socket(AF_UNIX, SOCK_DGRAM, 0);
if (sock < 0)
exit (EXIT_FAILURE);
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, path);
size = strlen(addr.sun_path) + sizeof(addr.sun_family);
if (connect(sock, (struct sockaddr *) &addr, size) < 0)
return -1;
return sock;
}
int sendMessage(int sock, unsigned char *message, int length)
{
int count;
count = send(sock, message, length, 0);
if (count < 0)
return -1;
return count;
}
答案 0 :(得分:3)
您无法告知发送方在接收方上发生了什么。可能是接收器进程现在甚至没有安排。唯一合理的方法是从接收方回复给发送方,在那里你可以等待一些超时来回答这个问题并决定接收方是否忙碌。
答案 1 :(得分:2)
您需要某种方式让接收方向发送方发信号通知其状态(读取与否)。 您可以使用几种IPC原语来实现此目的。
或者你可以自己做。 例如,接收者可以沿着这些方向做点什么:
mkdir("/path/to/my/flag/dir", 0555); /* ready */
read();
rmdir("/path/to/my/flag/dir"); /* busy */
并且发件人可以通过以下方式定期检查这是否存在:
oktogo = (access("/path/to/my/flag/dir", F_OK) == 0);