第九章 基本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