【问题标题】:getsockopt "Invalid argument" for IPPROTO_SCTP, SCTP_STATUS获取 IPPROTO_SCTP、SCTP_STATUS 的“无效参数”
【发布时间】:2014-07-16 20:38:11
【问题描述】:

场景:

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

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 的调用以在消息到达时读取消息

 rd_sz = Sctp_recvmsg( sock_fd, readbuf, sizeof( readbuf),
             (SA *)&cliaddr, &len, &sri,&msg_flags);

在客户端连接后,我调用getsockopt 来检索 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_address_to_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。

【问题讨论】:

  • 你如何获得你在 status.sstat_assoc_id 中的价值?如果关联 ID 无效,SCTP_STATUS 选项将返回 EINVAL
  • @nos 添加了其他信息。是我通过 struct sockaddr_in 但带有指向 sockaddr 的指针的错误吗?
  • 您的 sctp_address_to_associd() 中的 sctp_opt_info() 调用是否成功?对于一对多套接字,您也应该在那里传递一个关联 ID,至少对于大多数选项而言。
  • 注意,既然您已经使用了 sctp_recvmsg ,请尝试直接从 sri.sinfo_assoc_id 获取关联 ID,而不是 sctp_address_to_associd() 函数。
  • @nos 是,sctp_opt_info() 返回 0

标签: c++ c sockets sctp getsockopt


【解决方案1】:

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

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

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

【讨论】:

  • 为什么不能使用SCTP_PEER_ADDR_PARAMS选项来学习linux辅助?
猜你喜欢
  • 1970-01-01
  • 2012-11-21
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2016-12-31
  • 2018-08-02
相关资源
最近更新 更多