У меня есть пара кодов отправителя/получателя, написанная на C и Python. Клиент создает данные и отправляет их через сокет unix получателю. Получатель не всегда слушает сокет, потому что он должен что-то делать с полученными данными.
В моем текущем коде все сообщения, отправленные отправителем, ожидают в очереди получения получателем, но я не хочу такого поведения. Я хочу, чтобы отправитель знал, что получатель сейчас занят (может быть, даже путем выдачи ошибки). Итак, как я могу установить длину очереди получателя равной нулю?
Учтите, что я не хочу, чтобы процедура отправки или получения блокировалась.
Мои части кодов получателя и отправителя таковы:
Получатель (на 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
Отправитель (в С):
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
, я думаю, это может помочь вам узнать состояние приемника. - person CollioTV   schedule 05.09.2014select
, но я думаю, что это очень общий ответ. Кстати, я читаю это. - person MostafaR   schedule 05.09.2014select()
только говорит вам, что некоторыеsend()
будут работать без блокировки, то, что ваши отправленные данные в конечном итоге ожидают в буфере ОС, является допустимым (и вероятным) событием после того, какselect()
говорит вам, что все в порядке сsend()
- person John Hascall   schedule 05.09.2014