问题描述
我正在 C++ 中试验套接字,但我不明白为什么 accept()
函数中的最后一个参数是:
socklen_t *addr_len
我可以做到:
accept(m_sock,(struct sockaddr *)&addr,(socklen_t *)&addr);
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));