首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为IPPROTO_SCTP,SCTP_STATUS获取“无效参数”

为IPPROTO_SCTP,SCTP_STATUS获取“无效参数”
EN

Stack Overflow用户
提问于 2014-05-27 19:53:18
回答 1查看 3.3K关注 0票数 2

设想情况:

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

代码语言:javascript
复制
int sock_fd,msg_flags;
char readbuf[BUFFSIZE];
struct sockaddr_in servaddr, cliaddr;
struct sctp_sndrcvinfo sri;
struct sctp_event_subscribe evnts;
int stream_increment=1;
socklen_t len;
size_t rd_sz;

sock_fd = Socket( AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
bzero( &servaddr, sizeof( servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl( INADDR_ANY);
servaddr.sin_port = htons( SERV_PORT);

Bind( sock_fd, ( SA *) &servaddr, sizeof(servaddr));

bzero( &evnts, sizeof( evnts));
evnts.sctp_data_io_event = 1;
Setsockopt( sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof( evnts));

Listen( sock_fd, LISTENQ);

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

代码语言:javascript
复制
 rd_sz = Sctp_recvmsg( sock_fd, readbuf, sizeof( readbuf),
             (SA *)&cliaddr, &len, &sri,&msg_flags);

客户端连接之后,我调用取回来检索SCTP关联的当前状态。

代码语言:javascript
复制
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_address_to_associd是:

代码语言:javascript
复制
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操作系统是LinuxUbuntu12.10。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-27 20:52:25

SCTP_PEER_ADDR_PARAMS函数中的sctp_address_to_associd()套接字选项不能用于学习关联id,至少在linux上是如此。

由于您已经从sctp_recvmsg()调用中获得了关联id,所以可以使用struct sctp_sndrcvinfo的关联id:

代码语言:javascript
复制
status.sstat_assoc_id = sri.sinfo_assoc_id;
getsockopt( sock_fd, IPPROTO_SCTP, SCTP_STATUS, &status, &retsz);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23897781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档