SCTP应用编程中的注意事项

SCTP和TCP、UDP有些不一样,在写应用程序的时候需要注意一下。

1. 可以bind多个IP地址

这个是SCTP的特点,两端都可以用多个IP地址和对端来通信,因此不管是client端,还是server端,都可以bind多个IP地址(端口号必须相同)。

比如:

// bind第一个地址

bind(fd, (struct sockaddr *)&cliaddr1, sizeof(cliaddr));

// bind第二个地址

sctp_bindx(fd, (struct sockaddr *)&cliaddr2, 1, SCTP_BINDX_ADD_ADDR);

cliaddr1和cliaddr2里面,IP地址不同,PORT相同。

2. 需要注册事件通知

为了能调用sctp_recvmsg()收到对端发送的DATA,需要事先为该socket注册一个事件通知功能:

struct sctp_event_subscribe events;

events.sctp_data_io_event = 1;

setsockopt(fd, SOL_SCTP, SCTP_EVENTS, (const void *)&events, sizeof(events));

不注册这个事件通知,是不能通过调用sctp_recvmsg()接收对端的DATA的。

类似的,注册其他事件类型之后,可以通过sctp_recvmsg()收到SCTP_COMM_UP(连接建立完成)、SCTP_SHUTDOWN_EVENT(连接被关闭)等通知。

events.sctp_association_event = 1;

events.sctp_shutdown_event = 1;

sctp_recvmsg()接口使用方法如下:

 ret = sctp_recvmsg((int) fd,
                      (void *)buf,
                      (size_t)MAX_BUFF_SIZE,
                      (struct sockaddr *)from,
                      &fromlen,
                      (struct sctp_sndrcvinfo *)&rcvinfo,
                      (int *)&l_msg_flags);

通过l_msg_flags就能知道收到的buf中,到底是NOTIFICATION还是DATA(对端应用层的一条消息),以及DATA有没有接收完整:

 if (l_msg_flags & MSG_NOTIFICATION) { //收到一条通知消息
  l_notif = (union sctp_notification *)buf;
  if (l_notif->sn_header.sn_type == SCTP_ASSOC_CHANGE) {
   l_asschg = &l_notif->sn_assoc_change;
   switch (l_asschg->sac_state) {
   case SCTP_COMM_UP:

   ...

   }
  } else if (l_notif->sn_header.sn_type == SCTP_SHUTDOWN_EVENT) {
   l_shutdown = &l_notif->sn_shutdown_event;
   if (l_shutdown->sse_type == SCTP_SHUTDOWN_EVENT) {
    DEBUG_PRINT(fd, "notification = SCTP_SHUTDOWN_EVENT\n");
    clean_fd(fd);
   }
  }
 } else if (l_msg_flags & MSG_EOR) { //收到一条完整的DATA
  if (!g_data_performance_test) {
   printf("[sctp_recvmsg] fd = %d, %s\n", fd, buf);
  } else {  //收到一条不完整的DATA
   g_message_received++;
   g_message_total_size += ret;
  }





  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值