python — блокировка доменных сокетов от Unix

Я пишу две программы, одну на C ++, а другую на Python, чтобы общаться друг с другом с помощью доменных сокетов Unix. Я пытаюсь сделать так, чтобы код c ++ отправлял число в код python, который, в свою очередь, отправлял другой номер обратно в c ++. Это продолжается до тех пор, пока в коде c ++ не заканчиваются числа для отправки, и выполнение останавливается. Ниже приведены мои коды. Я не могу запустить их после первой итерации цикла.

Сначала я запускаю Python:
python code.py / tmp / 1 / tmp / 2

Затем я запускаю код C ++:
./ code / tmp / 1 / tmp / 2

Вот вывод:

Выход C ++:

отправлено 0
прослушивание
Соединение успешно
получил 5
отправлено 1
прослушивание

Выход Python:

слушаю …
получил (0,)
> 5
отправлено 5
слушаю …

Код C ++:

static int connFd;

int main(int argc, char* argv[])
{

int recv_sock,
send_sock;

struct sockaddr_un server, client;

///////////////////////////////////////////
//
// setup send
//
///////////////////////////////////////////

/* Create socket on which to send. */
send_sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (send_sock < 0)
{
perror("opening unix socket");
exit(1);
}

/* Construct name of socket to send to. */
client.sun_family = AF_UNIX;

strcpy(client.sun_path, argv[1]);

if (connect(send_sock, (struct sockaddr *) &client, sizeof(struct sockaddr_un)) < 0)
{
close(send_sock);
perror("connecting stream socket");
exit(1);
}///////////////////////////////////////////
//
// setup recv
//
///////////////////////////////////////////

recv_sock = socket(AF_UNIX, SOCK_STREAM, 0);

if(recv_sock< 0)
{
cerr << "Cannot open socket" << endl;
return 0;
}

bzero((char*) &server, sizeof(server));

server.sun_family = AF_UNIX;
strcpy(server.sun_path,  argv[2]);

//bind socket
if(bind(recv_sock, (struct sockaddr *)&server, sizeof(server)) < 0)
{
cerr << "Cannot bind" << endl;
return 0;
}

listen(recv_sock, 10);

int X;
for (int i = 0; i < 10; i++)
{
write(send_sock, &i, sizeof(i));
cout << "sent " << i << endl;
cout << "Listening" << endl;
connFd = accept(recv_sock, 0, 0);
if (connFd < 0)
{
cerr << "Cannot accept connection" << endl;
return 0;
}
else
{
cout << "Connection successful" << endl;
read(connFd, &X, sizeof(X));
cout << "received " << X << endl;
}

usleep(2000000);

}close(send_sock);
close(recv_sock);
unlink(argv[2]);
unlink(argv[1]);return 0;

}

Код Python:

import socket,os,struct, glob, sys
import random

send_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
recv_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
os.remove(sys.argv[1])
except OSError:
pass

recv_socket.bind(sys.argv[1])recv_socket.listen(10)
while 1:
print "listening ..."conn, addr = recv_socket.accept()
data = conn.recv(4)p = struct.unpack('i',data)
print 'received ', p

if p is '9':
breakl = int(raw_input(">"))
a = struct.pack('i', l)
send_socket.connect(sys.argv[2])
send_socket.sendall(a)
print 'sent ', l

send_socket.close()
conn.close()
recv_socket.close()

Что я делаю не так в этом подходе? Нужно ли использовать темы?

Спасибо

0

Решение

Вы по-разному обрабатываете сокеты отправки и получения в своем коде C ++: сокет отправки связывается один раз в начале программы, тогда как сокет получения принимает новое соединение на каждой итерации.

Ваша текущая реализация Python принимает новое соединение на recv_socket и соединяет send_socket на каждой итерации, которая объясняет проблему, с которой вы сталкиваетесь.

Наиболее эффективным решением было бы подключить каждый сокет один раз до цикла, если у вас нет веских причин открывать новое соединение на каждой итерации. Вот соответствующие списки кодов:

static int connFd;

int main(int argc, char *argv[]) {

int recv_sock, send_sock;

struct sockaddr_un server, client;

///////////////////////////////////////////
//
// setup send
//
///////////////////////////////////////////

/* Create socket on which to send. */
send_sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (send_sock < 0) {
perror("opening unix socket");
exit(1);
}

/* Construct name of socket to send to. */
client.sun_family = AF_UNIX;

strcpy(client.sun_path, argv[1]);

if (connect(send_sock, (struct sockaddr *)&client,
sizeof(struct sockaddr_un)) < 0) {
close(send_sock);
perror("connecting stream socket");
exit(1);
}

///////////////////////////////////////////
//
// setup recv
//
///////////////////////////////////////////

recv_sock = socket(AF_UNIX, SOCK_STREAM, 0);

if (recv_sock < 0) {
cerr << "Cannot open socket" << endl;
return 0;
}

bzero((char *)&server, sizeof(server));

server.sun_family = AF_UNIX;
strcpy(server.sun_path, argv[2]);

// bind socket
if (::bind(recv_sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
cerr << "Cannot bind" << endl;
return 0;
}

listen(recv_sock, 10);
connFd = accept(recv_sock, 0, 0);
if (connFd < 0) {
cerr << "Cannot accept connection" << endl;
return 0;
} else {
cout << "Connection successful" << endl;
}

int X;
for (int i = 0; i < 10; i++) {
write(send_sock, &i, sizeof(i));
cout << "sent " << i << endl;
cout << "Listening" << endl;
read(connFd, &X, sizeof(X));
cout << "received " << X << endl;
usleep(2000000);
}

close(send_sock);
close(recv_sock);
unlink(argv[2]);
unlink(argv[1]);

return 0;
}
recv_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
send_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
os.remove(sys.argv[1])
except OSError:
pass

recv_socket.bind(sys.argv[1])

recv_socket.listen(10)
conn, addr = recv_socket.accept()

send_socket.connect(sys.argv[2])

while 1:
print "listening ..."data = conn.recv(4)
p = struct.unpack('i',data)
print 'received ', p

if p is '9':
breakl = int(raw_input(">"))
a = struct.pack('i', l)
send_socket.sendall(a)
print 'sent ', l

send_socket.close()
conn.close()
recv_socket.close()
1

Другие решения


По вопросам рекламы [email protected]