来回Unix域套接字锁
back-and-forth unix domain sockets lock
我正在编写两个程序,一个用c++,另一个用Python,使用unix域套接字相互通信。我想做的是让c++代码向python代码发送一个数字,python代码反过来向c++发送另一个数字。这种情况一直持续到c++代码没有数字可发送,执行停止为止。下面是我的代码。我似乎无法在循环的第一次迭代之后运行它们。
先运行Python:
python code.py/tmp/1/tmp/2
。/code/tmp/1/tmp/2
输出如下:
c++输出: 0
发送听
连接成功
收到5
发送1
听
听……收到(0)
5>
发送5
听…
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':
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()
我在这个方法中做错了什么?我需要使用线程吗?
谢谢
在c++代码中,发送套接字和接收套接字的处理方式是不同的:发送套接字在程序开始时绑定一次,而接收套接字在每次迭代时接受一个新的连接。
你当前的Python实现接受recv_socket
上的新连接,并在每次迭代时连接send_socket
,这解释了你面临的问题。
最有效的修复方法是在循环之前连接每个套接字一次,除非您有充分的理由在每次迭代时打开一个新连接。下面是相应的代码清单:
<标题> c++ h1>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()
标题>
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 从Qt上的UNIX域套接字(QLocalSocket)读取
- 用于通信C++的 UNIX 套接字
- SOCAT,将TCP套接字转发到Unix套接字,将recvmsg()更改为read(),删除辅助数据
- Unix 套接字挂在 recv 上,直到我在任何地方放置/删除断点
- 在 unix 套接字上调用async_connect有意义吗?
- Qt5 有没有办法让QLocalServer监听抽象的Unix套接字
- Unix 域套接字与 Poco::Net::TCPServer.
- 通过用于UV4L数据通道的unix域套接字发送数据
- 使用UNIX套接字C++客户端与Node.js服务器通信的简单示例
- 如何以正确的方式读/写 UNIX 套接字
- Unix域套接字(C++)-客户端使服务器守护进程崩溃
- 将Unix套接字移植到Windows
- 如何使用boost::asio连接到unix域套接字
- Unix 域套接字:发送文件描述符和 select()
- 在 C/Unix 中的 IP 子网上侦听的套接字
- Unix 多播套接字线程安全吗?
- C++ 在基于 UNIX 套接字的客户端程序中 connect() 不会建立与服务器的连接
- Unix 套接字循环