Unix Socket没有发送(或接收)队列

时间:2014-09-05 09:35:02

标签: python c sockets unix-socket

我有一对用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;
}

2 个答案:

答案 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);