c++ - 在套接字中,为什么我必须在 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
?
解决方案
的最后一个参数accept()
是指针传递的输入/输出参数。调用者需要在第二个参数中传入分配缓冲区的地址,并在第三个参数中传入变量的地址,其中该变量指定缓冲区的分配大小。该函数会将接受的对等方的信息复制到调用者的缓冲区中,确保不超过指定的缓冲区大小。复制到缓冲区的字节数将在退出时写回变量。sockaddr_...
socklen_t
sockaddr_...
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));
推荐阅读
- node.js - 本地主机拒绝连接我的第一个 React 项目
- android - 如何在 Delphi 11 的 Androidapi.JNI.Support 中使用新的接口函数名称?
- ios - iOS Swift WebSocket - 为 Vapor 服务器设置会话数据
- c++ - 不被识别为支持的文件格式 ECW gdal api
- python - Python验证类属性
- mysql - Mysql交叉表固定列查询不显示某些多语言字符
- reactjs - 从 github 移动存储库,并获得 3 SyntaxErrors `Unexpected token`
- html - 如何使用owl-date-module将纪元时间发送到Angular中的后端API?
- c# - How to avoid duplicates when inserting data using OleDB and Entity Framework?
- azure - Can you combine multiple CI builds prior to a CD pipeline being triggered in Azure DevOps?