【问题标题】:How convert/put the char* variable into struct sockaddr?如何将 char* 变量转换/放入 struct sockaddr?
【发布时间】:2015-02-12 16:22:08
【问题描述】:
你好

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

【问题讨论】:

  • 你需要使用strcpy函数(或类似的)
  • 我用过,但是没用。也许我错误地将它放在 struct sockaddr saddr 中?当我使用指针时,我得到一个字母。
  • 请尝试类似google.com.ua/… 的方法。你会找到例子

标签: c++ linux sockets type-conversion


【解决方案1】:

抱歉,我刚刚意识到我之前的回答超出了主题,因为您似乎使用的是 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's Guide to Unix IPChttp://beej.us/guide/bgipc/output/html/multipage/unixsock.html

【讨论】:

    【解决方案2】:

    你想在那里初始化一个结构,但第二个参数不是 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';
    

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 2010-09-30
      • 1970-01-01
      • 2011-04-11
      • 2015-08-29
      相关资源
      最近更新 更多