首页 > 解决方案 > 在套接字中,为什么我必须在 connect() 中使用 sizeof(addr) 而不是在 accept() 中使用 (socklen_t)&addr?

问题描述

我正在用 C++ 中的套接字进行试验,但我不明白为什么accept()函数中的最后一个参数是:

socklen_t *addr_len

我可以这样做:

accept(m_sock, (struct sockaddr *)&addr, (socklen_t *)&addr);

但在connect()函数中,最后一个参数是:

socklen_t addr_len

当我这样做时出现错误:

connect(m_sock, (struct sockaddr *)&addr, (socklen_t)&addr);

错误:从指针转换为更小的类型“socklen_t”(又名“unsigned int”)丢失信息

在第二种情况下,为什么我必须使用sizeof(addr)而不是(socklen_t)&addr

标签: c++socketssizeofsocklen-t

解决方案


的最后一个参数accept()指针传递的输入/输出参数。调用者需要在第二个参数中传入分配缓冲区的地址,并在第三个参数中传入变量的地址其中该变量指定缓冲区的分配大小。该函数会将接受的对等方的信息复制到调用者的缓冲区中,确保不超过指定的缓冲区大小。复制到缓冲区的字节数将在退出时写回变量。sockaddr_...socklen_tsockaddr_...socklen_t

socklen_t addr_len = sizeof(addr);
accept(m_sock, (struct sockaddr *)&addr, &addr_len);

的最后一个参数connect()由 value传递的仅输入参数。调用者需要在第二个参数中传入分配和填充缓冲区的地址,并在第三个参数中传入缓冲区填充大小的。该函数将从调用者的缓冲区中读取,确保不超过指定的缓冲区大小。该函数不会将任何内容写回调用者,因此不需要变量(但您可以根据需要使用变量)。sockaddr_...sockaddr_...socklen_t

connect(m_sock, (struct sockaddr *)&addr, sizeof(addr));

推荐阅读