我有一个问题,即通过程序参数给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};
答案 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';