微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在套接字中,为什么我必须在 connect() 中使用 sizeof(addr) 而不是像在 accept() 中使用 (socklen_t)&addr ?

如何解决在套接字中,为什么我必须在 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,(socklen_t)&addr);

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

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

解决方法

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

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

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

connect(m_sock,sizeof(addr));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。