【问题标题】:C - connect function - Invalid Argument errorC - 连接函数 - 无效参数错误
【发布时间】:2014-11-06 20:23:06
【问题描述】:

我正在编写一个 C 程序以通过套接字在两个进程之间进行通信,并且我在调用连接函数时收到以下错误。

connect:: 参数无效

我在连接呼叫中遗漏了什么? 任何帮助都会很棒!

这是我的代码 -

void conn(char *hname)
{
    struct hostent *hp;
    struct sockaddr_in sin;
    int port = 10000;
    int s, rc;

    hp = gethostbyname(hname);
    if ( hp == NULL ) {
        fprintf(stderr, "host not found (%s)\n", hname);
        exit(1);
    }

    s = socket(AF_INET, SOCK_STREAM, 0);
    if ( s < 0 ) {
        perror("socket:");
        exit(left);
    }

    sin.sin_family = AF_INET;
    sin.sin_port = htons(port);
    memcpy(&sin.sin_addr, hp->h_addr_list[0], hp->h_length);

    rc = connect(s, (struct sockaddr *)&sin, sizeof(sin));
    if ( rc < 0 ) {
        perror("connect:");
        exit(rc);
    }
}

【问题讨论】:

  • 这就是您遇到的所有错误吗?尝试使用 clang 编译以获取更多详细信息。
  • 我拿走了你的代码,添加了char hname[] = "google.com"并将端口更改为80,并成功连接到google...这是在Ubuntu Linux 14.04上完成的。
  • struct sockaddr_in 有五个字段。你只填了三个。我一般memset整个烂到0才用。

标签: c sockets unix


【解决方案1】:

struct sockaddr_in 实例应初始化为零,例如,

struct sockaddr_in sin;
memset(&sin, '\0', sizeof(sin));

您使用的是哪个操作系统?在 linux 上,EINVAL 在调用connect(2) 失败后不是errno 的记录 值,但是,检查 linux 内核中的 TCP 和 UDP 源代码会发现 @987654329 的几种情况@ 被返回,通常用于无效的参数值。

另外,socket 的第一个参数是协议族。从历史上看,在 BSD 上,您将在那里使用的常量将是 PF_INET 而不是 AF_INET。在实践中,它们是相同的值,并且似乎至少在 RHEL 6 中实际上不再有一个常量。但如果你使用的是 BSD 系统,你应该使用 PF_INET。

【讨论】:

猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 2010-10-04
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多