`

SCTP 套接字编程基础函数

阅读更多
    SCTP 服务器可以使用 sctp_bindx 函数捆绑与所在主机系统相关 IP 地址的一个子集,而 TCP 服务器和 UDP 服务器要么捆绑所在主机的某个地址,要么捆绑所有地址,而不能捆绑这些地址的一个子集。
#include <netinet/sctp.h>
int sctp_bindx(int sockfd, const struct sockaddr *addrs, int addrcnt, int flags);
                                       /* 返回值:若成功,返回 0;否则,返回 -1 */

    其中,sockfd 是 socket 函数返回的套接字描述符,addrs 是一个指向紧凑的地址列表的指针,地址个数由 addrcnt 参数指定。每个套接字地址结构紧跟在前一个之后,中间没有填充字节,如下图所示。

    flags 参数指导 sctp_bindx 调用执行下表所示的两种行为之一。

    sctp_bindx 调用既可用于已绑定的套接字,也可用于未绑定的套接字。对于未绑定的套接字,sctp_bindx 将把给定的地址集合捆绑到其上。对于已绑定的套接字,若指定 SCTP_BINDX_ADD_ADDR,则把额外的地址加入到套接字描述符,若指定 SCTP_BINDX_REM_ADDR,则从套接字描述符的已加入地址中移除给定的地址。如果在一个监听套接字上调用该函数,那么新的地址配置将只会影响新产生的关联。所有套接字地址结构的端口号必须相同,并且要与已经绑定的端口号相匹配,否则调用将产生 EINVAL 错误码。
    如果一个端点支持动态地址特性,那么 sctp_bindx 将导致该端点向对端发送一个合适的消息,以修改对端的地址列表。由于增减一个已连接关联的地址只是一个可选的功能,因此不支持此功能的实现将返回 EOPNOTSUPP。本特性对于支持动态接口供给的系统可能有用,比如如果调出一个新的以太网接口,那么应用进程可以指定 SCTP_BINDX_ADD_ADDR 标志来在已经存在的连接上启动使用这个接口。
    SCTP 中还有下面一组常用的函数。
#include <netinet/sctp.h>
int sctp_connectx(int sockfd, const struct sockaddr *addrs, int addrcnt);
                                       /* 返回值:若成功,返回 0;否则,返回 -1 */
int sctp_getpaddrs(int sockfd, sctp_assoc_t id, struct sockaddr **addrs);
            /* 返回值:若成功,返回存放在 addrs 中的对端地址数;否则,返回 -1 */
void sctp_freepaddrs(struct sockaddr *addrs);

int sctp_getladdrs(int sockfd, sctp_assoc_t id, struct sockaddr **addrs);
            /* 返回值:若成功,返回存放在 addrs 中的本端地址数;否则,返回 -1 */
void sctp_freeladdrs(struct sockaddr *addrs);

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);
ssize_t sctp_recvmsg(int sockfd, void *msg, size_t msgsz,
                     struct sockaddr *from, socklen_t *fromlen,
                     struct sctp_sndrcvinfo *sinfo, int *msg_flags);
             /* 两个函数的返回值:若成功,则为所写或所读的字节数;否则,为 -1 */

int sctp_opt_info(int sockfd, sctp_assoc_t assoc_id, int opt, void *arg, socklen_t *siz);
                                    /* 返回值:若成功,返回 0;否则,返回 -1 */
int sctp_peeloff(int sockfd, sctp_assoc_t id);
                   /* 返回值:若成功,返回一个新的套接字描述符;否则,返回 -1 */

    sctp_connectx 函数用于连接到一个多宿对端主机。该函数在 addrs 参数中指定 addrcnt 个全部属于同一对端的地址,addrs 中的所有地址都被会认为是有效的经过证实的地址,SCTP 栈使用其中一个或多个地址建立关联。
    由于 getpeername 函数用于 SCTP 时仅仅返回主目的地址,所以如果需要知道对端的所有地址,应该使用 sctp_getpaddrs 函数。其中的 id 参数是一到多式套接字的关联标识,一到一式套接字会忽略该字段。addrs 参数的地址内容是由本函数动态分配并填入的紧凑的地址列表,用完后应该使用 sctp_freepaddrs 函数释放所分配的资源。
    sctp_getladdrs 和 sctp_freeladdrs 函数的用法同 sctp_getpaddrs 和 sctp_freepaddrs,只是它们是针对本端的。
    相比较于 sendmsg 函数,sctp_sendmsg 函数以指定更多参数为代价简化了发送方法,它将长度为 msgsz 字节的缓冲区 msg 内容发送给对端 to,tolen 参数指定了存放在 to 中的地址长度。ppid 参数指定将随数据块传递的净荷协议标识符。flags 参数将传递给 SCTP 栈,用以标识任何 SCTP 选项(如果实现把 sctp_sendmsg 映射成 sendmsg 函数,则 sendmsg 的 flags 参数会被设为 0),其有效取值同SCTP 套接字选项一节中提到的 sctp_sndrcvinfo 结构中的 sinfo_flags 字段。
    stream 参数指定一个 SCTP 流号。timetolive 参数以毫秒为单位指定消息的生命期,其中 0 表示无限生命期。context 参数用于指定可能有的用户上下文,用户上下文把通过消息通知机制收到的某次失败消息发送与某个特定于应用的本地上下文关联起来。
    类似于 sctp_sendmsg,sctp_recvmsg 函数也为 SCTP 的高级特性提供了一个更方便的接口。使用本函数不仅能获取对端的地址,也能获取通常伴随 recvmsg 函数调用返回的 msg_flags 参数,其中存放了可能有的消息标志。此外,如果使用 SCTP_EVENTS 套接字选项预订了 sctp_data_io_event(默认情况下开启),那么就会有与消息相关的细节信息来填充 sctp_sndrcvinfo 结构。
    sctp_opt_info 函数是为无法为 SCTP 使用 getsockopt 函数的那些实现提供的,因为有些 SCTP 套接字选项(如 SCTP_STATUS)需要一个入出(in_out)变量传递关联标识。对于无法为 getsockopt 函数提供入出变量的系统来说,就只能使用 sctp_opt_info 函数。这里的assoc_id 参数给出可能存在的关联标识,opt 参数是 SCTP 的套接字选项,arg 给出套接字选项参数,siz 则用于存放参数的大小。
    sctp_peeloff 函数可用于从一个一到多式套接字中抽取一个关联,单独构成一个一到一式套接字。其语义就像带有一个额外参数的 accept 函数,调用者把一个一到多式套接字的 sockfd 和待抽取的关联标识 id 传递给函数调用,调用结束时将返回一个新的套接字描述符,它是一个与所请求关联对应的一到一式套接字描述符。
  • 大小: 7 KB
  • 大小: 16.3 KB
  • 大小: 24.4 KB
分享到:
评论

相关推荐

    Elementary-SCTP-Sockets.zip_Elementary

    2. **SCTP套接字API**:讲解如何在不同编程语言(如C或C++)中使用SCTP套接字API,包括sctp_bind、sctp_connect、sctp_sendmsg和sctp_recvmsg等函数的使用方法。 3. **流的概念**:解释SCTP中的流是如何工作的,...

    UNIX网络编程卷1,套接字联网API(第3版)(中文版)(Stun[总结].pdf

    这部分还详细解释了TCP套接字编程的关键函数,如socket、connect、bind和listen,以及如何使用它们来建立和管理TCP连接。书中还提供了大量的示例代码,帮助读者理解和应用这些概念。 第三部分通过实际的TCP客户/...

    UNIX网络编程卷1套接字联网API.part1.rar

    讨论了当今最关键的标准、实现和技术 讨论的新主题包括: POSIX Single UNIX Specification Version 3 IPv6 APIs(包括更新了的对IPv6/IPv4互操作性的指南) 新的SCTP传输协议 基于IPsec的密钥管理套接字 ...

    UNIX网络编程卷1套接字联网API.part2.rar

    讨论了当今最关键的标准、实现和技术 讨论的新主题包括: POSIX Single UNIX Specification Version 3 IPv6 APIs(包括更新了的对IPv6/IPv4互操作性的指南) 新的SCTP传输协议 基于IPsec的密钥管理套接字 ...

    UNIX网络编程(第一卷)套接口API和XOpen传输接口

    - **定义**:套接口API是一组用于实现网络通信的函数集合,它定义了如何创建、配置和使用套接字。 - **类型**:主要包括流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)两种类型。流式套接字提供可靠的数据传输...

    linux 下sctp的开源代码

    开发者可以通过标准的套接字API(socket API)来使用SCTP服务。 3. **GCC编译环境**:GCC(GNU Compiler Collection)是Linux开发的常用工具,用于将源代码编译为可执行程序。这个开源代码库需要使用GCC来编译SCTP...

    unix网络编程 第一卷

    包含了套接字地址结构、值-结果参数、字节排序函数、字节操作函数、IP地址转换函数、读写函数等基础知识点。这些基础知识为后续更深入的网络编程打下坚实的基础。 书中对于TCP套接字的介绍更是细致入微,从创建套接...

    UNIX网络编程卷2进程间通信

    讨论了当今最关键的标准、实现和技术 讨论的新主题包括: POSIX Single UNIX Specification Version 3 IPv6 APIs(包括更新了的对IPv6/IPv4互操作性的指南) 新的SCTP传输协议 基于IPsec的密钥管理套接字 ...

    Unix网络编程英文版PDF

    对于初学者来说,书中从一个简单的daytime客户端和服务器的例子出发,逐步讲解了如何使用各种套接字接口进行网络编程。通过这些实例,读者可以了解到协议独立性的重要性,以及编写网络程序时应当如何处理错误。 ...

    Unix网络编程 3rd vol1 读书笔记.docx

    总结来说,Unix网络编程中,TCP协议允许服务器通过socket pair并发处理多个客户端连接,缓存管理对性能有直接影响,而套接字地址结构是实现网络通信的基础。理解这些核心概念对于编写高效的网络应用至关重要。

    UNIX网络编程卷1

    - **socket函数**:创建套接字的接口,是所有网络编程的基础。 - **connect函数**:客户端用于发起连接请求。 - **bind函数**:绑定套接字到特定端口。 - **listen函数**:服务器端监听客户端连接请求。 - **accept...

    leve6网络编程学习笔记.pdf

    3. **listen()函数**:将一个主动套接字转换为被动套接字,以便接收来自客户端的连接请求。 4. **accept()函数**:接受一个连接请求,并返回一个新的套接字用于与客户端通信。 5. **connect()函数**:用于客户端主动...

    用UDP协议实现网络通信

    1. **创建套接字**:在发送方和接收方,首先需要通过系统调用创建一个UDP套接字,这个套接字是进行网络通信的基础。 2. **绑定端口**:发送方和接收方都要绑定到特定的IP地址和端口号,以便数据能够正确地发送和接收...

    unix网络编程 江西师范大学课件

    在Unix环境下进行网络编程,主要涉及的是套接字(Socket)接口API,这是网络通信的基础。本课件可能涵盖从基础的TCP/IP概念到高级的SCTP协议的使用。 首先,TCP连接的TIME_WAIT状态是非常重要的。它确保了TCP全双工...

    C++ Network Programming(ACE)

    网络编程主要涉及套接字编程,包括TCP/IP套接字和UDP套接字,以及相关的数据打包和解包、错误处理和连接管理。C++的模板、类和面向对象特性使得代码更易于组织和重用,同时也能够实现更复杂的数据结构和算法。 然后...

    Nanomsg 代码分析

    3. **线程安全性**:Nanomsg中的套接字设计为线程安全的,解决了ZeroMQ中存在的问题,即每个对象都需要被隔离在自己的线程中。 4. **内存和CPU使用效率**:为了提高内存管理效率,Nanomsg使用了基数树(Radix Tree)...

    linux下用c写的traceroute

    1. **初始化**: 创建一个UDP套接字,设置其TTL值为1,然后将其绑定到本地的任意端口。 2. **发送数据包**: 以递增的TTL值(通常从1开始,每次增加1)发送数据包到目标主机。每个数据包包含目标主机的IP地址和一个...

Global site tag (gtag.js) - Google Analytics