C++ SCTP recvmsg返回EFAULT(错误地址)

C++ SCTP recvmsg返回EFAULT(错误地址),c++,linux,sockets,sctp,C++,Linux,Sockets,Sctp,为了测试的目的,我试图构建一个非常简单和基本的STCP一对多服务器,但是出于某种原因,套接字似乎只能接收一条消息。接收到一条消息后,对recvmsg的每个后续调用都返回-1,errno为EFAULT。这对我来说毫无意义,所以也许你可以告诉我我在这里没有看到什么。EFAULT应该在 埃法特 接收缓冲区指针指向进程的地址空间之外 这绝对不是事实 包括 包括 包括 包括 包括 包括 包括 包括 int main argc,字符**argv{ 绑定地址中的结构sockaddr\u; bind_addre

为了测试的目的,我试图构建一个非常简单和基本的STCP一对多服务器,但是出于某种原因,套接字似乎只能接收一条消息。接收到一条消息后,对recvmsg的每个后续调用都返回-1,errno为EFAULT。这对我来说毫无意义,所以也许你可以告诉我我在这里没有看到什么。EFAULT应该在

埃法特 接收缓冲区指针指向进程的地址空间之外

这绝对不是事实

包括 包括 包括 包括 包括 包括 包括 包括 int main argc,字符**argv{ 绑定地址中的结构sockaddr\u; bind_address.sin_family=AF_INET; bind_address.sin_port=htons51338; bind_address.sin_addr.s_addr=INADDR\u ANY; int sock=socketAF INET,sock seq packet,IPPROTO_SCTP; 如果sock==-1{ 创建套接字时出错; 返回1; } int rv=bindsock,struct sockaddr*&绑定地址,sizeofbind\u地址; 如果rv!=0{ 绑定套接字时出错; 返回1; } rv=列表锁,1; 如果rv!=0{ 边听边犯错误; 返回1; } 结构iovec iov[1]; iov[0]。iov_base=malloc1500; iov[0]。iov_len=1500; sin={}中的结构sockaddr_; 字符控制[1000]={0}; 结构msghdr-mhdr; mhdr.msg_iov=iov; mhdr.msg_iovlen=sizeofiov; mhdr.msg_name=&sin; mhdr.msg_namelen=sizeofsin; mhdr.msg_control=&control; mhdr.msg_controllen=sizeofcontrol; 虽然是真的{ std::memsetiov[0]。iov_base,0,iov[0]。iov_len; 标准:memset&sin,0,sizeofsin; int recv_bytes=recvmsgsock&mhdr,0; 如果recv_字节==-1{ 如果errno==EAGAIN | | errno==EWOULDBLOCK{ 持续 }否则{ 佩罗雷尔; } 打破 }
std::cout该错误最有可能是因为对recvmsg的第一次调用覆盖了堆栈上的一些数据,导致mhdr中的一个指针无效。这可能是因为这一行:

mhdr.msg_iovlen = sizeof(iov);
这不应包含数组iov的大小(以字节为单位),而应仅包含该数组中的元素数,因此:

mhdr.msg_iovlen = sizeof(iov) / sizeof(*iov); // which equals 1 in this case

该错误最有可能是因为对recvmsg的第一次调用覆盖了堆栈上的一些数据,导致mhdr中的一个指针无效。这可能是因为这一行:

mhdr.msg_iovlen = sizeof(iov);
这不应包含数组iov的大小(以字节为单位),而应仅包含该数组中的元素数,因此:

mhdr.msg_iovlen = sizeof(iov) / sizeof(*iov); // which equals 1 in this case

谢谢,这似乎解决了这个问题!我的印象是错误的,SigeFoFr数组会返回数组元素的数量,而不是占用字节数。我想回到C++学校。如果你可以使用C++ 17,你可以使用它。它可以做到你所期望的。谢谢,这似乎解决了这个问题!我在T下。错误的印象是,sisiFoFr数组会返回数组元素的数量,而不是占用字节数。我猜回到C++学校。如果你可以使用C++ 17,你可以使用它。它可以做到你所期望的。