2012-06-24 25 views
3

我是newbee,只是在linux下开始使用C++的第一步。 所以我有一些关于套接字的任务。我正在关注指南,尤其是this之一。而代码示例不起作用。我开始与此:Ubuntu上的套接字(不允许操作)

#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; 
} 

我已经想通了,编译它(代码::块),必须有一个更包括:

#include <unistd.h> 

但成功运行后,我收到消息“绑定:不允许操作”。哪里不对?我试图在root下运行它,但仍然无法正常工作。

+1

用sudo运行你的应用程序 – SjB

+0

也许你遇到了这个问题? http://stackoverflow.com/questions/6826407/why-i-cant-create-raw-socket-in-ubuntu – alf

+0

只需使用运行按钮。我想知道如何配置Code :: Blocks在sudo下运行它?它执行xterm。 – binariti

回答

2

一些Unix系统不允许你在任何地方创建套接字。确保你有正确的权限和正确的文件系统。 (Fat32,因为它在手机SD卡上使用,将不允许附加标志文件,并可能会让你陷入困境) 最后在新系统上有像selinux一样运行的安全产品,可能会阻塞套接字的创建。

在我的例子,我不得不改变

#define SOCK_PATH "echo_socket" 

#define SOCK_PATH "/dev/socket/echo_socket" 

后立即奏效。 (可执行文件在根shell中启动)

+1

我认为有必要指出的是,这对于Android来说是特别真实的,并且必须使用'/ dev/socket'前缀(或任何其他合适的文件系统)。 –

1

由于没有权限。 您可以 #define SOCK_PATH "/home/username/echo_socket" 它会正常运行。

+1

欢迎来到StackOverflow。请详细说明您的答案,因为已经存在类似和更详细的答案。请解释一下,你的答案如何改善现有的方式。 –

+0

一般情况下,总是处理主目录中的文件,以确保权限。 –