我正在尝试使用UNIX域套接字在C程序和Python脚本之间进行通信。 Python脚本通过UNIX域套接字将数据发送到C程序。
以下是我的C程序中的相关代码:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#define UNIX_PATH_MAX 100
int main(void)
{
struct sockaddr_un address;
int socket_fd, connection_fd;
socklen_t address_length;
pid_t child;
socket_fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (socket_fd < 0){
printf("socket() failed\n");
return 1;
}
unlink("/tmp/demo_socket");
memset(&address, 0, sizeof(struct sockaddr_un));
address.sun_family = AF_UNIX;
snprintf(address.sun_path, UNIX_PATH_MAX, "/tmp/demo_socket");
if (bind(socket_fd, (struct sockaddr *) &address, sizeof(struct sockaddr_un)) != 0) {
printf("bind() failed\n");
return 1;
}
if(listen(socket_fd, 5) != 0) {
printf("listen() failed\n");
return 1;
}
//----------------WHILE LOOP----------------------->
while((connection_fd = accept(socket_fd,
(struct sockaddr *) &address,
&address_length)) > -1)
{
.
.
.(doesn't get any further than this)
这是我用来向套接字发送消息的python脚本:
import socket
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/demo_socket")
print "Sending..."
s.send("Hello world")
x = s.recv(1024)
print x
s.close()
python脚本失败并显示错误“Broken Pipe”。 C程序永远不会进入while循环,因为accept()函数失败并返回'-1'。
为什么accept()失败?我能做些什么才能让它成功?
答案 0 :(得分:2)
查看an example I found,您传递bind
的长度似乎不应计算sockaddr_un
中的终止或填充空值。
尝试:
size_t addrlen;
const char* sockname = "/tmp/demo_socket";
/* ... */
address.sun_family = AF_UNIX;
snprintf(address.sun_path, UNIX_PATH_MAX, sockname);
addrlen = sizeof(address.sun_family) + strlen(sockname);
if (bind(socket_fd, (struct sockaddr *) &address, addrlen) != 0) {
printf("bind() failed\n");
return 1;
}
P.S。因此,您不需要memset
来电。
答案 1 :(得分:2)
IIRC,address_length
需要在sockaddr_un
来电之前初始化为accept()
的大小。在调用期间,它会加载对等地址的实际长度,该地址被推入address
。
RGDS, 马丁