网络编程

本章主要讲的是SCTP套接字编程
1.SCTP和TCP的主要区别
SCTP是信息导向,非字节流
支持多流:一个连接内有多个逻辑流,某流阻塞不影响其他
支持多宿:一个端点可有多个IP
四次握手:优雅关闭

  1. 接口概览
    socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)
    注意:type 用 SOCK_SEQPACKET(有序数据报),不是 SOCK_STREAM

  2. sctp_bindx - 绑定多个地址
    int sctp_bindx(int sockfd, const struct sockaddr *addrs, int addrcnt, int flags);
    flags: SCTP_BINDX_ADD_ADDR / SCTP_BINDX_REM_ADDR

  3. 连接的建立与关闭
    connect、listen、accept 语义与 TCP 类似
    sctp_connectx:可指定多个对端地址

  4. 数据收发
    sctp_sendmsg / sctp_recvmsg - 带流号、消息边界的收发
    struct sctp_sndrcvinfo 包含 stream、ppid、flags 等
    sctp_send(sockfd, msg, len, ...) - 简单发送

  5. 通知与事件
    SCTP_EVENTS 选项订阅事件:sctp_data_io_event、sctp_association_event 等
    sctp_recvmsg 返回的 sctp_sndrcvinfo 可带流号、关联信息

  6. 简单 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);
    }

posted on 2026-03-02 10:32  cyusouyiku  阅读(1)  评论(0)    收藏  举报