如何将char *变量转换/放入struct sockaddr?

时间:2015-02-12 16:22:08

标签: c++ linux sockets type-conversion

你好

我有一个问题,即通过程序参数给socket添加名称。 我尝试过多种方式,一些转换(strcpy函数)等。但在最好的选择中,它给了我一个来自我名字的字母。如何将其转换/放入该结构?

void socket_out(char* name)
{
int listfd;
int connfd;

listfd = socket(AF_UNIX, SOCK_STREAM, 0);
if(listfd == -1)
    exit(-1);

struct sockaddr saddr = {AF_UNIX, name};
socklen_t saddrlen = sizeof(struct sockaddr) + 6;
bind(listfd, &saddr, saddrlen);

错误:

  

错误:从'char *'到'char'的无效转换[-fpermissive]        struct sockaddr saddr = {AF_UNIX,name};

2 个答案:

答案 0 :(得分:0)

抱歉,我刚刚意识到我之前的回答是不可能的,因为你似乎使用的是Unix域套接字,而不是TCP / IP套接字。

问题是你不应该直接使用struct sockaddr,而应该使用其中一个"特化",在这种情况下struct sockaddr_un,然后在最后一分钟投出它。看看下面的例子:

unsigned int s, s2;
struct sockaddr_un local, remote;
int len;

s = socket(AF_UNIX, SOCK_STREAM, 0);
local.sun_family = AF_UNIX;
strcpy(local.sun_path, "/home/beej/mysocket");
unlink(local.sun_path);
len = strlen(local.sun_path) + sizeof(local.sun_family);
bind(s, (struct sockaddr *)&local, len);

取自优秀的 Beej的Unix IPC指南http://beej.us/guide/bgipc/output/html/multipage/unixsock.html

答案 1 :(得分:0)

你想要在那里初始化一个结构,但是第二个参数不是char *类型,而是char []类型。 请参阅struct sockaddr的定义:

The <sys/socket.h> header shall define the sockaddr structure that includes at least the following members:

sa_family_t  sa_family  Address family. 
char         sa_data[]  Socket address (variable-length data). 

要解决这个问题,你必须使用strcpy / strncpy作为第二个参数:

struct sockaddr saddr;
saddr.sun_family = AF_UNIX; 
strncpy(saddr.sun_path, name, UNIX_PATH_MAX);
addr.sun_path[UNIX_PATH_MAX - 1] = '\0';