【问题标题】:What Is The Purpose Of A sockaddr_in In This Program?这个程序中 sockaddr_in 的目的是什么?
【发布时间】:2013-09-24 00:33:55
【问题描述】:

对于我的一个课程,我必须编写一个服务器和一个客户端,并且我们得到了一些示例代码可以使用。这是我感到困惑的sn-p:

main()
{
int      sock, sock_current, cc, fromlen, tolen; /*sd is the socket */
int      addrlen;
struct   sockaddr_in sin;
struct   sockaddr_in pin;

/* get an internet domain socket */
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    exit(1);
}

/* complete the socket structure */
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(PORT);

/* bind the socket to the port number */
if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) == -1) {
    perror("bind");
    exit(1);
}

我认为 sockaddr_in 结构体 sin 的目的是存储一个本地 IP 地址,以便在绑定时与 sock 关联。我对此是否正确?如果我是正确的,这个 sn-p 代码是如何实现的?没看懂:

/* complete the socket structure */
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(PORT);

【问题讨论】:

  • 你在纠结哪一点?

标签: c sockets client-server


【解决方案1】:

bind 函数将本地协议地址分配给套接字。这里sin的目的是告诉bind分配哪个本地地址。

memset(&sin, 0, sizeof(sin));     
sin.sin_family = AF_INET;          //it's an IPv4 address
sin.sin_addr.s_addr = INADDR_ANY;  //wildcard IP address
sin.sin_port = htons(PORT);        //bind to this port number

【讨论】:

    【解决方案2】:

    除了Yu所说的(这都是正确的),如果你在调用listen()之前没有调用bind(这可能是在你发布的sn-p之后),它会监听一个随机的TCP端口(因为您在调用socket() 时打开了一个 IPv4 TCP 套接字)。

    这有时真的很有用——我有一个应用程序通过 LAN 广播它运行的端口供客户端找到它,所以它在哪个端口上并不重要。

    此外,您可以在调用connect() 之前进行绑定,如果您愿意,可以强制在哪个端口或接口上进行传出连接,但这也不常见。

    【讨论】:

      猜你喜欢
      • 2023-02-10
      • 2021-01-23
      • 2021-10-22
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多