本章主要讲的是SCTP套接字编程
1.SCTP和TCP的主要区别
SCTP是信息导向,非字节流
支持多流:一个连接内有多个逻辑流,某流阻塞不影响其他
支持多宿:一个端点可有多个IP
四次握手:优雅关闭
-
接口概览
socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)
注意:type 用 SOCK_SEQPACKET(有序数据报),不是 SOCK_STREAM -
sctp_bindx - 绑定多个地址
int sctp_bindx(int sockfd, const struct sockaddr *addrs, int addrcnt, int flags);
flags: SCTP_BINDX_ADD_ADDR / SCTP_BINDX_REM_ADDR -
连接的建立与关闭
connect、listen、accept 语义与 TCP 类似
sctp_connectx:可指定多个对端地址 -
数据收发
sctp_sendmsg / sctp_recvmsg - 带流号、消息边界的收发
struct sctp_sndrcvinfo 包含 stream、ppid、flags 等
sctp_send(sockfd, msg, len, ...) - 简单发送 -
通知与事件
SCTP_EVENTS 选项订阅事件:sctp_data_io_event、sctp_association_event 等
sctp_recvmsg 返回的 sctp_sndrcvinfo 可带流号、关联信息 -
简单 SCTP 回射服务器骨架
sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
Bind(sock_fd, ...);
Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));
Listen(sock_fd, LISTENQ);
for (;😉 {
rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf), &cliaddr, &len, &sri, &msg_flags);
Sctp_sendmsg(sock_fd, readbuf, rd_sz, &cliaddr, len, sri.sinfo_ppid, sri.sinfo_flags, sri.sinfo_stream, 0, 0);
}
浙公网安备 33010602011771号