convert/put如何把char*变量改成struct sockaddr?

How convert/put the char* variable into struct sockaddr?

你好

我在通过程序参数为套接字命名时遇到问题。 我尝试了很多方法,一些转换(strcpy 函数)等。但在最好的选择中,它给了我一个来自我名字的字母。我怎样才能 convert/put 它进入那个结构?

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);

错误:

error: invalid conversion from ‘char*’ to ‘char’ [-fpermissive] struct sockaddr saddr = {AF_UNIX, name};

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

问题是您永远不应该直接使用 struct sockaddr,而是其中一个 "specializations",在本例中为 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's Guide to Unix IPChttp://beej.us/guide/bgipc/output/html/multipage/unixsock.html

你想在那里初始化一个结构,但第二个参数不是 char* 类型,而是 char[] 类型。 请参阅结构 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] = '[=11=]';