UNP函数笔记七: 基本SCTP套接字编程

本文档深入探讨了第九章中的基本SCTP(Stream Control Transmission Protocol)套接字编程,详细介绍了如何利用struct和stream进行IO操作,同时讲解了header层的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第九章  基本SCTP套接字编程:

#include <netinet/sctp.h>
int sctp_bindx(int sockfd, const struct sockaddr * addrs, 
               int addrcnt, int flags);
    flags:
        SCTP_BINDX_ADD_ADDR, SCTP_BINDX_REM_ADDR
    success return 0, error return -1

#include <netinet/sctp.h>
int sctp_connectx(int sockfd, const struct sockaddr * addrs, int addrcnt);
    success return 0, error return -1

#include <netinet/sctp.h>
int sctp_getpaddrs(int sockfd, sctp_assoc_t id, struct sockaddr ** addrs);
    success return peer-addr-count, error return -1

#include <netinet/sctp.h>
void sctp_freepaddrs(struct sockaddr * addrs);

#include <netinet/sctp.h>
int sctp_getladdrs(int sockfd, sctp_assoc_t id, struct sockaddr ** addrs);
    success return local-addr-count, error return -1

#include <netinet/sctp.h>
void sctp_freeladdrs(struct sockaddr * addrs);

#include <netinet/sctp.h>
ssize_t sctp_sendmsg(int sockfd, const void * msg, size_t msgsz, 
                     const struct sockaddr * to, socklen_t tolen, 
                     uint32_t ppid, 
                     uint32_t flags, uint16_t stream, 
                     uint32_t timetolive, uint32_t context);
    timetolive, ms
    success return write-bytes, error return -1

#include <netinet/sctp.h>
ssize_t sctp_recvmsg(int sockfd, void * msg, size_t msgsz, 
                     struct sockaddr * from, socklen_t * fromlen, 
                     struct sctp_sndrcvinfo * sinfo, int * msg_flags);
    success return read-bytes, error return -1

#include <netinet/sctp.h>
int sctp_opt_info(int sockfd, sctp_assoc_t assoc_id, 
                  int opt, void * arg, socklen_t * siz);
    success return 0, error return -1

#include <netinet/sctp.h>
int sctp_peeloff(int sockfd, sctp_assoc_t id);
    success return new-sockfd, error return -1


struct sctp_tlv {
    u_int16_t sn_type;
    u_int16_t sn_flags;
    u_int32_t sn_length;
};
sn_type:                         sctp-socket-option:
    SCTP_ASSOC_CHANGE                sctp_association_event
    SCTP_PEER_ADDR_CHANGE            sctp_address_event
    SCTP_REMOTE_ERROR                sctp_peer_error_event
    SCTP_SEND_FAILED                 sctp_send_failure_event
    SCTP_SHUTDOWN_EVENT              sctp_shutdown_event
    SCTP_ADAPTION_INDICATION         sctp_adaption_layer_event
    SCTP_PARTIAL_DELIVERY_EVENT      sctp_partial_delivery_event
                                     sctp_data_io_event (default open)
/* notification event */
union sctp_notification {
    struct sctp_tlv sn_header;
    struct sctp_assoc_change sn_assoc_change;
    struct sctp_paddr_change sn_paddr_change;
    struct sctp_remote_error sn_remote_error;
    struct sctp_send_failed sn_send_failed;
    struct sctp_shutdown_event sn_shutdown_event;
    struct sctp_adaption_event sn_adaption_event;
    struct sctp_pdapi_event sn_pdapi_event;
};

SCTP_ASSOC_CHANGE:
struct sctp_assoc_change {
    u_int16_t sac_type;
    u_int16_t sac_flags;
    u_int32_t sac_length;
    u_int16_t sac_state;
    u_int16_t sac_error;
    u_int16_t sac_outbound_streams;
    u_int16_t sac_inbound_streams;
    sctp_assoc_t sac_assoc_id;
    uint8_t   sac_info[];
};
sac_state:
    SCTP_COMM_UP         /* have new connect */
    SCTP_COMM_LOST       /* close a connect */
    SCTP_RESTART         /* remote restart */ 
    SCTP_SHUTDOWN_COMP   /* shutdown complete */
    SCTP_CANT_STR_ASSOC  /* can not get ack */

SCTP_PEER_ADDR_CHANGE:
struct sctp_paddr_change {
    u_int16_t spc_type;
    u_int16_t spc_flags;
    u_int32_t spc_length;
    struct sockaddr_storage spc_aaddr;
    u_int32_t spc_state;
    u_int32_t spc_error;
    sctp_assoc_t spc_assoc_id;
};
spc_state:
    SCTP_ADDR_ADDED        /* address adds to connection */
    SCTP_ADDR_AVAILABLE    /* address becomes reachable */
    SCTP_ADDR_CONFIRMED    /* address is valid */
    SCTP_ADDR_MADE_PRIM    /* address becomes the primary address */
    SCTP_ADDR_REMOVED      /* address removed from connection */
    SCTP_ADDR_UNREACHABLE  /* address becomes unreachable */

SCTP_REMOTE_ERROR:
struct sctp_remote_error {
    u_int16_t sre_type;
    u_int16_t sre_flags;
    u_int32_t sre_length;
    u_int16_t sre_error;
    sctp_assoc_t sre_assoc_id;
    u_int8_t  sre_data[];
};

SCTP_SEND_FAILED:
struct sctp_send_failed {
    u_int16_t ssf_type;
    u_int16_t ssf_flags;
    u_int32_t ssf_length;
    u_int32_t ssf_error;
    struct sctp_sndrcvinfo ssf_info;
    sctp_assoc_t ssf_assoc_id;
    u_int8_t  ssf_data[];
};
ssf_flags:
    SCTP_DATA_UNSENT
    SCTP_DATA_SENT

SCTP_SHUTDOWN_EVENT:
struct sctp_shutdown_event {
    u_int16_t sse_type;
    u_int16_t sse_flags;
    u_int32_t sse_length;
    sctp_assoc_t sse_assoc_id;
};

SCTP_ADAPTION_INDICATION:
struct sctp_adaption_event {
    u_int16_t sai_type;
    u_int16_t sai_flags;
    u_int32_t sai_length;
    u_int32_t sai_adaption_ind;
    sctp_assoc_t sai_assoc_id;
};

SCTP_PARTIAL_DELIVERY_EVENT:
struct sctp_pdapi_event {
    u_int16_t pdapi_type;
    u_int16_t pdapi_flags;
    u_int32_t pdapi_length;
    u_int32_t pdapi_indication;
    sctp_assoc_t pdapi_assoc_id;
};
pdapi_indication:
    SCTP_PARTIAL_DELIVERY_ABORTED


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值