【问题标题】:socket programming - meaning of the parameter in connect() [closed]套接字编程-connect()中参数的含义[关闭]
【发布时间】:2015-06-05 03:51:00
【问题描述】:

我刚开始学习套接字编程,在connect()函数中发现了这个不寻常的参数。

(struct sockaddr *)&server 

socket()函数的sn-p:

if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
{
    puts("connect error");
    return 1;
}

【问题讨论】:

标签: c sockets


【解决方案1】:

如果您对为什么指向server 的指针(我假设它的类型为sockaddr_in)感到困惑,它不会传递给函数,而是转换为指向struct sockaddr 的指针,那么这就是您的答案:

struct sockaddr_in 只是struct sockaddr 的包装结构:

struct sockaddr {
    unsigned short sa_family;
    char           sa_data[14];
};

端口号和 IP 地址在这里保存在一起。它们在sa_data[14] 中保存在一起——第一个2 bytes 保存端口号,下一个4 bytes 保存IP 地址。剩余的8 bytes 未使用。这些是您在使用sockaddr_in 时通过sin_zero[8] 清零的8 bytes

connect() 这样的函数不知道struct sockaddr_in 的任何类型,它们只知道struct sockaddr

【讨论】:

    【解决方案2】:

    server 是您要连接的主机的协议地址。如果是 IPv4 套接字,你应该使用 struct sockaddr_in* 转换为 struct sockaddr*,如果是 IPv6 套接字,你应该使用 struct sockaddr_in6* 转换为 struct sockaddr*

    【讨论】:

    • 不,我只是对语法和转换等感到困惑......请帮助我......
    • 嗯,它希望你给一个指针,因此&amp;server 而不是server。并且因为它用于具有不同sockaddr_foo 结构的所有协议,所以您将其转换为struct sockaddr*,这是所有协议的通用结构。因此(struct sockaddr*)&amp;server.
    【解决方案3】:

    sockaddr 结构用于存储参与 Windows 套接字通信的计算机的 Internet 协议 (IP) 地址。 connect() 函数用于客户端连接服务器。所以第二个参数基本上都是填写服务器IP和端口信息,这样客户端就可以连接到IP和端口标识的服务器了

    【讨论】:

    • 不,我只是对语法和转换等感到困惑......请帮助我
    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多