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 IPC:http://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=]';
我在通过程序参数为套接字命名时遇到问题。 我尝试了很多方法,一些转换(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 IPC:http://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=]';