Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来回unix域套接字锁 我写了两个程序,一个是C++,另一个是Python程序,用UNIX域套接字进行通信。我想做的是C++代码发送一个数字到Python代码,然后再发送另一个数字返回到C++。这一直持续到C++代码耗尽发送的数量,执行停止。下面是我的代码。我似乎无法让它们通过循环的第一次迭代_Python_C++_Sockets_Unix Socket_Python Sockets - Fatal编程技术网

来回unix域套接字锁 我写了两个程序,一个是C++,另一个是Python程序,用UNIX域套接字进行通信。我想做的是C++代码发送一个数字到Python代码,然后再发送另一个数字返回到C++。这一直持续到C++代码耗尽发送的数量,执行停止。下面是我的代码。我似乎无法让它们通过循环的第一次迭代

来回unix域套接字锁 我写了两个程序,一个是C++,另一个是Python程序,用UNIX域套接字进行通信。我想做的是C++代码发送一个数字到Python代码,然后再发送另一个数字返回到C++。这一直持续到C++代码耗尽发送的数量,执行停止。下面是我的代码。我似乎无法让它们通过循环的第一次迭代,python,c++,sockets,unix-socket,python-sockets,Python,C++,Sockets,Unix Socket,Python Sockets,我首先运行Python: python code.py/tmp/1/tmp/2 然后运行C++代码: /代码/tmp/1/tmp/2 以下是输出: C++输出: 已发送0 倾听 连接成功 收到5份 已发送1个 倾听 Python输出: 倾听…… 收到(0,) >5 已发送5个 倾听…… C++代码: 在这种方法中我做错了什么?我需要使用线程吗 谢谢< p>您在C++代码中处理发送和接收套接字的方式不同:发送套接字在程序开始时被绑定一次,而接收套接字在每次迭代中接受新连接。 当前的Python

我首先运行Python:
python code.py/tmp/1/tmp/2

然后运行C++代码:
/代码/tmp/1/tmp/2

以下是输出:

C++输出: 已发送0
倾听
连接成功
收到5份
已发送1个
倾听



Python输出: 倾听……
收到(0,)
>5
已发送5个
倾听……

C++代码: 在这种方法中我做错了什么?我需要使用线程吗


谢谢

< p>您在C++代码中处理发送和接收套接字的方式不同:发送套接字在程序开始时被绑定一次,而接收套接字在每次迭代中接受新连接。 当前的Python实现在
recv\u socket
上接受一个新连接,并在每次迭代时连接
send\u socket
,这解释了您所面临的问题

最有效的修复方法是在循环之前连接每个套接字一次,除非您有充分的理由在每次迭代时打开一个新连接。以下是相应的代码清单:

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;

}
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':
      break


   l = 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()
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':
      break


   l = int(raw_input(">"))
   a = struct.pack('i', l)
   send_socket.sendall(a)
   print 'sent ', l

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