我是新手,只是在linux下用c ++完成我的第一步。 所以我有一些关于套接字的任务。我正在关注指南,特别是this一个。代码示例不起作用。我从这开始:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCK_PATH "echo_socket"
int main(void)
{
int s, s2, t, len;
struct sockaddr_un local, remote;
char str[100];
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
local.sun_family = AF_UNIX;
strcpy(local.sun_path, SOCK_PATH);
unlink(local.sun_path);
len = strlen(local.sun_path) + sizeof(local.sun_family);
if (bind(s, (struct sockaddr *)&local, len) == -1) {
perror("bind");
exit(1);
}
return 0;
}
我已经想出要编译它(Code :: Blocks),还必须有一个include:
#include <unistd.h>
但是在成功运行后,我收到消息“Bind:Operation not permitted”。怎么了?我试图在root下运行它仍然无法正常工作。
答案 0 :(得分:2)
某些Unix系统不允许您在任何地方创建套接字。确保您拥有正确的权限和正确的文件系统。 (在手机上的sdcards上使用的Fat32不允许在文件中添加额外的标志,可能会让你遇到麻烦) 最后在较新的系统上运行像selinux这样的安全事件,可能会阻止套接字的创建。
在我的例子中,我不得不改变
#define SOCK_PATH "echo_socket"
到
#define SOCK_PATH "/dev/socket/echo_socket"
之后,它立即起作用。 (可执行文件在root shell中启动)
答案 1 :(得分:1)
因为没有许可。
您可以
#define SOCK_PATH "/home/username/echo_socket"
它会正常运行。