C++ getsockopt";无效参数";对于IPPROTO_SCTP,SCTP_状态

C++ getsockopt";无效参数";对于IPPROTO_SCTP,SCTP_状态,c++,c,sockets,sctp,getsockopt,C++,C,Sockets,Sctp,Getsockopt,情景: 我已经创建了SCTP一对多套接字(以大写字母开头的函数调用相应的标准函数,并检查错误并将errno打印到stderr) 然后我阻塞了对sctp_recvmsg的调用,以便在消息到达时读取消息 rd_sz = Sctp_recvmsg( sock_fd, readbuf, sizeof( readbuf), (SA *)&cliaddr, &len, &sri,&msg_flags); 在客户端连接之后,我调用以检索SCTP关联

情景:

我已经创建了SCTP一对多套接字(以大写字母开头的函数调用相应的标准函数,并检查错误并将errno打印到stderr)

然后我阻塞了对sctp_recvmsg的调用,以便在消息到达时读取消息

 rd_sz = Sctp_recvmsg( sock_fd, readbuf, sizeof( readbuf),
             (SA *)&cliaddr, &len, &sri,&msg_flags);
在客户端连接之后,我调用以检索SCTP关联的当前状态

len = sizeof(struct sockaddr_in);
socklen_t retsz;
struct sctp_status status;
retsz = sizeof(status); 
bzero(&status,sizeof(status));

status.sstat_assoc_id = sctp_address_to_associd(sock_fd, (SA *)&cliaddr, len);  
getsockopt( sock_fd, IPPROTO_SCTP, SCTP_STATUS, &status, &retsz);
sctp_地址_至_associd的功能为:

sctp_assoc_t
sctp_address_to_associd(int sock_fd, struct sockaddr *sa, socklen_t salen)
{
    struct sctp_paddrparams sp;
    socklen_t siz;

    siz = sizeof(struct sctp_paddrparams);
    bzero(&sp,siz);
    memcpy(&sp.spp_address,sa,salen);
    sctp_opt_info(sock_fd,0,
           SCTP_PEER_ADDR_PARAMS, &sp, &siz);
    return(sp.spp_assoc_id);
}

为什么getsockopt返回“无效参数”?errno=22。操作系统是Linux Ubuntu 12.10

函数
SCTP\u address\u to\u associd()
中的SCTP\u PEER\u ADDR\u PARAMS socket选项不能用于学习关联id,至少在linux上不能

由于您已经从sctp_recvmsg()调用中获得了关联id,因此请改用结构sctp_sndrcvinfo的关联id:

status.sstat_assoc_id = sri.sinfo_assoc_id;
getsockopt( sock_fd, IPPROTO_SCTP, SCTP_STATUS, &status, &retsz);

您如何获得您在status.sstat\u assoc\u id中的值?如果assoc id为,SCTP_状态选项将返回EINVALinvalid@nos添加了其他信息。是我传入结构sockaddr\u但带有指向sockaddr的指针的错误吗?sctp\u opt\u info()调用sctp\u address\u to\u associd()是否成功?对于一对多套接字,至少在大多数选项中,您也应该传入一个assoc id。注意,由于您已经使用了
sctp\u recvmsg
,请尝试直接从
sri.sinfo\u assoc\u id
获取关联id,而不是sctp\u address\u to\u associd()函数。@no是的,sctp\u opt\u info()返回0为什么不能使用
SCTP\u PEER\u ADDR\u PARAMS
选项在linux中帮助学习?
status.sstat_assoc_id = sri.sinfo_assoc_id;
getsockopt( sock_fd, IPPROTO_SCTP, SCTP_STATUS, &status, &retsz);