【发布时间】:2014-10-30 05:25:39
【问题描述】:
我有一对用 C 和 Python 编写的发送方/接收方代码。客户端正在生成数据并通过 unix 套接字将其发送到接收器。 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;
}
【问题讨论】:
-
我邀请您看看
man 3 select是如何工作的,我认为它可以帮助您了解接收器的状态 -
@CollioTV 谢谢,我知道
select,但我认为这是一个非常笼统的答案。顺便说一句,我正在读这篇文章。 -
select()仅告诉您某些send()是否可以在没有阻塞的情况下工作,在select()告诉您之后,让您发送的数据最终在操作系统缓冲区中等待是有效的(并且可能)发生可以send()
标签: python c sockets unix-socket