日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux网络编程之SCTP套接字常用接口

發(fā)布時(shí)間:2023/12/4 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux网络编程之SCTP套接字常用接口 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載地址: oracle開發(fā)幫助文檔:http://docs.oracle.com/cd/E19253-01/819-7052/index.html

SCTP 套接字接口

當(dāng)?socket()?調(diào)用為?IPPROTO_SCTP?創(chuàng)建套接字時(shí),它會(huì)調(diào)用特定于 SCTP 的套接字創(chuàng)建例程。針對(duì) SCTP 套接字執(zhí)行的套接字調(diào)用會(huì)自動(dòng)調(diào)用相應(yīng)的 SCTP 套接字例程。在一對(duì)一套接字中,每個(gè)套接字都對(duì)應(yīng)一個(gè) SCTP 關(guān)聯(lián)。可以通過調(diào)用以下函數(shù)來創(chuàng)建一對(duì)一套接字:

socket(AF_INET[6], SOCK_STREAM, IPPROTO_STCP);?

在一對(duì)多風(fēng)格套接字中,每個(gè)套接字都處理多個(gè) SCTP 關(guān)聯(lián)。每個(gè)關(guān)聯(lián)都具有一個(gè)名為?sctp_assoc_t?的關(guān)聯(lián)標(biāo)識(shí)符。可以通過調(diào)用以下函數(shù)來創(chuàng)建一對(duì)多套接字:

socket(AF_INET[6], SOCK_SEQPACKET, IPPROTO_STCP);?

sctp_bindx()

int sctp_bindx(int? sock , void? *addrs , int? addrcnt , int? flags );?

sctp_bindx()?函數(shù)管理 SCTP 套接字上的地址。如果?sock?參數(shù)為 IPv4 套接字,則傳送給?sctp_bindx()?函數(shù)的地址必須為 IPv4 地址。如果?sock?參數(shù)為 IPv6 套接字,則傳送給?sctp_bindx()?函數(shù)的地址可以為 IPv4 或 IPv6 地址。當(dāng)傳送給?sctp_bindx()?函數(shù)的地址為?INADDR_ANY?或?IN6ADDR_ANY?時(shí),此套接字將綁定到所有可用地址。可以使用?bind(3SOCKET)?綁定 SCTP 端點(diǎn)。

*addrs?參數(shù)的值是指向包含一個(gè)或多個(gè)套接字地址的數(shù)組的指針。每個(gè)地址都包含在其相應(yīng)的結(jié)構(gòu)中。如果地址為 IPv4 地址,則它們可以包含在?sockaddr_in?結(jié)構(gòu)或?sockaddr_in6?結(jié)構(gòu)中。如果地址為 IPv6 地址,則它們可以包含在?sockaddr_in6?結(jié)構(gòu)中。可以通過地址類型系列區(qū)分地址長(zhǎng)度。調(diào)用方使用?addrcnt?參數(shù)指定數(shù)組中的地址數(shù)。

如果成功,則?sctp_bindx()?函數(shù)將返回 0。如果失敗,則?sctp_bindx()?函數(shù)將返回 -1,并將?errno?的值設(shè)置為相應(yīng)的錯(cuò)誤代碼。

如果沒有為每個(gè)套接字地址提供同一端口,則?sctp_bindx()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。

通過對(duì)以下零個(gè)或多個(gè)當(dāng)前定義的標(biāo)志執(zhí)行按位 OR 運(yùn)算,即可形成?flags?參數(shù):

  • SCTP_BINDX_ADD_ADDR

  • SCTP_BINDX_REM_ADDR

SCTP_BINDX_ADD_ADDR?指示 SCTP 將給定地址添加到關(guān)聯(lián)中。SCTP_BINDX_REM_ADDR?指示 SCTP 從關(guān)聯(lián)中刪除給定地址。這兩個(gè)標(biāo)志相互排斥。如果同時(shí)提供這兩個(gè)標(biāo)志,則?sctp_bindx()?將失敗,并將?errno?的值設(shè)置為?EINVAL。

調(diào)用方無法刪除關(guān)聯(lián)中的所有地址。sctp_bindx()?函數(shù)拒絕此類嘗試的表現(xiàn)為:函數(shù)失敗并將?errno?的值設(shè)置為?EINVAL。應(yīng)用程序可以在調(diào)用?bind()?函數(shù)之后使用?sctp_bindx(SCTP_BINDX_ADD_ADDR),將其他地址與端點(diǎn)關(guān)聯(lián)。應(yīng)用程序可以使用?sctp_bindx(SCTP_BINDX_REM_ADDR)?刪除與偵聽套接字關(guān)聯(lián)的地址。使用?sctp_bindx(SCTP_BINDX_REM_ADDR)?刪除地址之后,接受新關(guān)聯(lián)將不會(huì)重新關(guān)聯(lián)已刪除的地址。如果端點(diǎn)支持動(dòng)態(tài)地址,則可以使用?SCTP_BINDX_REM_ADDR?或?SCTP_BINDX_ADD_ADDR?向?qū)Φ确桨l(fā)送消息來更改對(duì)等方的地址列表。在已連接的關(guān)聯(lián)中添加和刪除地址為可選功能。不支持此功能的實(shí)現(xiàn)將返回?EOPNOTSUPP。

如果地址族不是?AF_INET?或?AF_INET6,則?sctp_bindx()?函數(shù)將失敗并返回?EAFNOSUPPORT。如果?sock?參數(shù)中傳遞給?sctp_bindx()?的文件描述符無效,則?sctp_bindx()?函數(shù)將失敗并返回?EBADF。

sctp_opt_info()

int sctp_opt_info(int? sock , sctp_assoc_id_t? id , int? opt , void? *arg , socklen_t? *len );?

sctp_opt_info()?函數(shù)將返回與?sock?參數(shù)中所述的套接字關(guān)聯(lián)的 SCTP 級(jí)別選項(xiàng)。如果此套接字為一對(duì)多風(fēng)格 SCTP 套接字,則?id?參數(shù)的值是某個(gè)特定關(guān)聯(lián)。對(duì)于一對(duì)一風(fēng)格 SCTP 套接字,將忽略?id?參數(shù)。opt?參數(shù)的值指定要獲取的 SCTP 套接字選項(xiàng)。arg?參數(shù)的值是為調(diào)用程序而分配的特定于選項(xiàng)的結(jié)構(gòu)緩沖區(qū)。*len?參數(shù)的值為選項(xiàng)長(zhǎng)度。

opt?參數(shù)可以采用以下值:

SCTP_RTOINFO

返回用于初始化和綁定重新傳輸超時(shí) (retransmission timeout, RTO) 可調(diào)參數(shù)的協(xié)議參數(shù)。這些協(xié)議參數(shù)使用以下結(jié)構(gòu):

struct sctp_rtoinfo {sctp_assoc_t srto_assoc_id;uint32_t srto_initial;uint32_t srto_max; uint32_t srto_min;}; srto_assoc_id

調(diào)用程序提供此值,它指定所關(guān)注的關(guān)聯(lián)。

srto_initial

此值為初始 RTO 值。

srto_max

此值為最大 RTO 值。

srto_min

此值為最小 RTO 值。

SCTP_ASSOCINFO

返回特定于關(guān)聯(lián)的參數(shù)。這些參數(shù)使用以下結(jié)構(gòu):

struct sctp_assocparams {sctp_assoc_t sasoc_assoc_id;uint16_t sasoc_asocmaxrxt;uint16_t sasoc_number_peer_destinations;uint32_t sasoc_peer_rwnd;uint32_t sasoc_local_rwnd;uint32_t sasoc_cookie_life;}; sasoc_assoc_id

調(diào)用程序提供此值,它指定所關(guān)注的關(guān)聯(lián)。

sasoc_assocmaxrxt

此值指定關(guān)聯(lián)的最大重新傳輸計(jì)數(shù)。

sasoc_number_peer_destinations

此值指定對(duì)等方具有的地址數(shù)。

sasoc_peer_rwnd

此值指定對(duì)等方接收窗口的當(dāng)前值。

sasoc_local_rwnd

此值指定對(duì)等方傳輸?shù)降纳弦粋€(gè)已報(bào)告的接收窗口。

sasoc_cookie_life

此值指定關(guān)聯(lián) cookie 的生命周期。可在發(fā)出 cookie 時(shí)使用此值。

所有使用時(shí)間值的參數(shù)均以毫秒為單位。

SCTP_DEFAULT_SEND_PARAM

返回?sendto(3SOCKET)?函數(shù)調(diào)用在此關(guān)聯(lián)中使用的缺省參數(shù)集。這些參數(shù)使用以下結(jié)構(gòu):

struct sctp_sndrcvinfo {uint16_t sinfo_stream;uint16_t sinfo_ssn;uint16_t sinfo_flags;uint32_t sinfo_ppid;uint32_t sinfo_context;uint32_t sinfo_timetolive;uint32_t sinfo_tsn;uint32_t sinfo_cumtsn;sctp_assoc_t sinfo_assoc_id;}; sinfo_stream

此值指定?sendmsg()?調(diào)用的缺省流。

sinfo_ssn

此值始終為 0。

sinfo_flags

此值包含?sendmsg()?調(diào)用的缺省標(biāo)志。此標(biāo)志可以采用以下值:

  • MSG_UNORDERED

  • MSG_ADDR_OVER

  • MSG_ABORT

  • MSG_EOF

  • MSG_PR_SCTP

sinfo_ppid

此值為?sendmsg()?調(diào)用的缺省有效負(fù)荷協(xié)議標(biāo)識(shí)符。

sinfo_context

此值為?sendmsg()?調(diào)用的缺省上下文。

sinfo_timetolive

此值指定時(shí)間段(以毫秒為單位)。在此時(shí)間段過后,如果消息傳輸尚未開始,則消息將過期。值為 0 指示消息尚未過期。如果設(shè)置了?MSG_PR_SCTP?標(biāo)志,當(dāng)消息傳輸未在?sinfo_timetolive?所指定的時(shí)間段內(nèi)成功完成時(shí),消息將過期。

sinfo_tsn

此值始終為 0。

sinfo_cumtsn

此值始終為 0。

sinfo_assoc_id

此值由調(diào)用程序填充。它指定所關(guān)注的關(guān)聯(lián)。

SCTP_PEER_ADDR_PARAMS

返回所指定對(duì)等地址的參數(shù)。這些參數(shù)使用以下結(jié)構(gòu):

struct sctp_paddrparams {sctp_assoc_t spp_assoc_id;struct sockaddr_storage spp_address;uint32_t spp_hbinterval;uint16_t spp_pathmaxrxt;}; spp_assoc_id

調(diào)用程序提供此值,它指定所關(guān)注的關(guān)聯(lián)。

spp_address

此值指定所關(guān)注的對(duì)等地址。

spp_hbinterval

此值指定心跳間隔(以毫秒為單位)。

spp_pathmaxrxt

此值指定在認(rèn)為地址不可訪問之前針對(duì)此地址嘗試的最大重新傳輸數(shù)。

SCTP_STATUS

返回有關(guān)關(guān)聯(lián)的當(dāng)前狀態(tài)信息。這些參數(shù)使用以下結(jié)構(gòu):

struct sctp_status {sctp_assoc_t sstat_assoc_id;int32_t sstat_state;uint32_t sstat_rwnd;uint16_t sstat_unackdata;uint16_t sstat_penddata;uint16_t sstat_instrms;uint16_t sstat_outstrms;uint32_t sstat_fragmentation_point;struct sctp_paddrinfo sstat_primary;}; sstat_assoc_id

調(diào)用程序提供此值,它指定所關(guān)注的關(guān)聯(lián)。

sstat_state

此值為關(guān)聯(lián)的當(dāng)前狀態(tài)。關(guān)聯(lián)可以采用以下狀態(tài):

SCTP_IDLE

SCTP 端點(diǎn)沒有任何與其關(guān)聯(lián)的關(guān)聯(lián)。一旦?socket()?函數(shù)調(diào)用打開一個(gè)端點(diǎn)或端點(diǎn)關(guān)閉,則端點(diǎn)便會(huì)處于此狀態(tài)。

SCTP_BOUND

SCTP 端點(diǎn)在調(diào)用?bind()?之后綁定到一個(gè)或多個(gè)本地地址。

SCTP_LISTEN

此端點(diǎn)在等待來自任何遠(yuǎn)程 SCTP 端點(diǎn)的關(guān)聯(lián)請(qǐng)求。

SCTP_COOKIE_WAIT

此 SCTP 端點(diǎn)已發(fā)送 INIT 塊并在等待 INIT-ACK 塊。

SCTP_COOKIE_ECHOED

此 SCTP 端點(diǎn)已將從其對(duì)等方的 INIT-ACK 塊接收的 cookie 回顯到對(duì)等方。

SCTP_ESTABLISHED

此 SCTP 端點(diǎn)可以與其對(duì)等方交換數(shù)據(jù)。

SCTP_SHUTDOWN_PENDING

此 SCTP 端點(diǎn)已從其上層接收了 SHUTDOWN 元語。此端點(diǎn)不再從其上層接受數(shù)據(jù)。

SCTP_SHUTDOWN_SEND

處于 SCTP_SHUTDOWN_PENDING 狀態(tài)的 SCTP 端點(diǎn)已向其對(duì)等方發(fā)送了 SHUTDOWN 塊。僅在確認(rèn)所有從此端點(diǎn)到其對(duì)等方的未完成數(shù)據(jù)之后,才發(fā)送 SHUTDOWN 塊。當(dāng)此端點(diǎn)的對(duì)等方發(fā)送 SHUTDOWN ACK 塊時(shí),此端點(diǎn)會(huì)發(fā)送 SHUTDOWN COMPLETE 塊并認(rèn)為關(guān)聯(lián)已關(guān)閉。

SCTP_SHUTDOWN_RECEIVED

SCTP 端點(diǎn)已從其對(duì)等方接收了 SHUTDOWN 塊。此端點(diǎn)不再從其用戶接受新數(shù)據(jù)。

SCTP_SHUTDOWN_ACK_SEND

處于 SCTP_SHUTDOWN_RECEIVED 狀態(tài)的 SCTP 端點(diǎn)已向其對(duì)等方發(fā)送了 SHUTDOWN ACK 塊。此端點(diǎn)僅在其對(duì)等方確認(rèn)來自此端點(diǎn)的所有未完成數(shù)據(jù)之后發(fā)送 SHUTDOWN ACK 塊。當(dāng)此端點(diǎn)的對(duì)等方發(fā)送 SHUTDOWN COMPLETE 塊時(shí),將關(guān)閉關(guān)聯(lián)。

sstat_rwnd

此值為關(guān)聯(lián)對(duì)等方的當(dāng)前接收窗口。

sstat_unackdata

此值為未確認(rèn)的 DATA 塊數(shù)。

sstat_penddata

此值為等待接收的 DATA 塊數(shù)。

sstat_instrms

此值為傳入的流數(shù)。

sstat_outstrms

此值為外發(fā)的流數(shù)。

sstat_fragmentation_point

如果消息、SCTP 數(shù)據(jù)包頭和 IP 數(shù)據(jù)包頭的組合大小超出?sstat_fragmentation_point?的值,則消息會(huì)分段。此值等于包目標(biāo)地址的路徑最大傳輸單元 (Path Maximum Transmission Unit, P-MTU)。

sstat_primary

此值包含有關(guān)主要對(duì)等地址的信息。此信息使用以下結(jié)構(gòu):

struct sctp_paddrinfo {sctp_assoc_t spinfo_assoc_id;struct sockaddr_storage spinfo_address;int32_t spinfo_state;uint32_t spinfo_cwnd;uint32_t spinfo_srtt;uint32_t spinfo_rto;uint32_t spinfo_mtu;}; spinfo_assoc_id

調(diào)用程序提供此值,它指定所關(guān)注的關(guān)聯(lián)。

spinfo_address

此值為主要對(duì)等地址。

spinfo_state

此值可以采用?SCTP_ACTIVE?或?SCTP_INACTIVE?兩個(gè)值中的任意一個(gè)。

spinfo_cwnd

此值為對(duì)等地址的擁塞窗口。

spinfo_srtt

此值為對(duì)等地址的當(dāng)前平滑往返時(shí)間計(jì)算結(jié)果,以毫秒為單位。

spinfo_rto

此值為對(duì)等地址的當(dāng)前重新傳輸超時(shí)值,以毫秒為單位。

spinfo_mtu

此值為對(duì)等地址的 P-MTU。

如果成功,則?sctp_opt_info()?函數(shù)將返回 0。如果失敗,則?sctp_opt_info()?函數(shù)將返回 -1,并將?errno?的值設(shè)置為相應(yīng)的錯(cuò)誤代碼。如果?sock?參數(shù)中傳遞給?sctp_opt_info()?的文件描述符無效,則?sctp_opt_info()?函數(shù)將失敗并返回?EBADF。如果?sock?參數(shù)中傳遞給?sctp_opt_info()?函數(shù)的文件描述符沒有描述套接字,則?sctp_opt_info()?函數(shù)將失敗并返回?ENOTSOCK。如果關(guān)聯(lián) ID 對(duì)于一對(duì)多風(fēng)格 SCTP 套接字而言無效,則?sctp_opt_info()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。如果輸入緩沖區(qū)長(zhǎng)度對(duì)于指定的選項(xiàng)而言過短,則?sctp_opt_info()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。如果對(duì)等地址的地址族不是?AF_INET?或?AF_INET6,則?sctp_opt_info()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EAFNOSUPPORT。

sctp_recvmsg()

ssize_t sctp_recvmsg(int? s , void? *msg , size_t? len , struct sockaddr? *from , socklen_t? *fromlen , struct sctp_sndrcvinfo? *sinfo , int? *msg_flags );?

使用?sctp_recvmsg()?函數(shù),可以從?s?參數(shù)所指定的 SCTP 端點(diǎn)接收消息。調(diào)用程序可以指定以下屬性:

msg

此參數(shù)為消息緩沖區(qū)的地址。

len

此參數(shù)為消息緩沖區(qū)的長(zhǎng)度。

from

此參數(shù)為指向包含發(fā)送主機(jī)地址的地址的指針。

fromlen

此參數(shù)為與?from?參數(shù)中的地址關(guān)聯(lián)的緩沖區(qū)的大小。

sinfo

此參數(shù)僅在調(diào)用程序啟用?sctp_data_io_events?時(shí)處于活動(dòng)狀態(tài)。要啟用?sctp_data_io_events,請(qǐng)使用套接字選項(xiàng)?SCTP_EVENTS?調(diào)用?setsockopt()?函數(shù)。如果啟用了?sctp_data_io_events,則應(yīng)用程序?qū)⒔邮彰總€(gè)傳入消息的?sctp_sndrcvinfo?結(jié)構(gòu)的內(nèi)容。此參數(shù)為指向?sctp_sndrcvinfo?結(jié)構(gòu)的指針。此結(jié)構(gòu)將在接收消息時(shí)進(jìn)行填充。

msg_flags

此參數(shù)包含所有存在的消息標(biāo)志。

sctp_recvmsg()?函數(shù)將返回其接收的字節(jié)數(shù)。sctp_recvmsg()?函數(shù)將在出現(xiàn)錯(cuò)誤時(shí)返回 -1。

如果在?s?參數(shù)中傳遞的文件描述符無效,則?sctp_recvmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EBADF。如果在?s?參數(shù)中傳遞的文件描述符沒有描述套接字,則?sctp_recvmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?ENOTSOCK。如果?msg_flags?參數(shù)包括值?MSG_OOB,則?sctp_recvmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EOPNOTSUPP。如果沒有建立關(guān)聯(lián),則?sctp_recvmsg()?函數(shù)將失敗,并將?errno的值設(shè)置為?ENOTCONN。

sctp_sendmsg()

ssize_t sctp_sendmsg(int? s , const void? *msg , size_t? len , const struct sockaddr? *to , socklen_t? tolen , uint32_t? ppid , uint32_t? flags , uint16_t? stream_no , uint32_t? timetolive , uint32_t? context );?

sctp_sendmsg()?函數(shù)在發(fā)送來自 SCTP 端點(diǎn)的消息時(shí)啟用高級(jí) SCTP 功能。

s

此值指定發(fā)送消息的 SCTP 端點(diǎn)。

msg

此值包含?sctp_sendmsg()?函數(shù)所發(fā)送的消息。

len

此值為消息的長(zhǎng)度,以字節(jié)為單位。

to

此值為消息的目標(biāo)地址。

tolen

此值為目標(biāo)地址的長(zhǎng)度。

ppid

此值為應(yīng)用程序指定的有效負(fù)荷協(xié)議標(biāo)識(shí)符。

stream_no

此值為此消息的目標(biāo)流。

timetolive

此值為消息未能成功發(fā)送到對(duì)等方的情況下消息過期之前可以等待的時(shí)間段,以毫秒為單位。

context

如果在發(fā)送消息時(shí)出現(xiàn)錯(cuò)誤,則返回此值。

flags

此值在將邏輯運(yùn)算 OR 以按位形式應(yīng)用于以下零個(gè)或多個(gè)標(biāo)志位時(shí)形成:

MSG_UNORDERED

設(shè)置此標(biāo)志之后,sctp_sendmsg()?函數(shù)將無序傳送消息。

MSG_ADDR_OVER

設(shè)置此標(biāo)志之后,sctp_sendmsg()?函數(shù)將使用?to?參數(shù)中的地址,而不使用關(guān)聯(lián)的主要目標(biāo)地址。此標(biāo)志僅用于一對(duì)多風(fēng)格 SCTP 套接字。

MSG_ABORT

設(shè)置此標(biāo)志之后,指定的關(guān)聯(lián)將異常中止,同時(shí)向其對(duì)等方發(fā)送 ABORT 信號(hào)。此標(biāo)志僅用于一對(duì)多風(fēng)格 SCTP 套接字。

MSG_EOF

設(shè)置此標(biāo)志之后,指定的關(guān)聯(lián)將進(jìn)入正常關(guān)機(jī)狀態(tài)。此標(biāo)志僅用于一對(duì)多風(fēng)格 SCTP 套接字。

MSG_PR_SCTP

設(shè)置此標(biāo)志之后,如果消息傳輸未在?timetolive?參數(shù)所指定的時(shí)間段內(nèi)成功完成,則消息將過期。

sctp_sendmsg()?函數(shù)將返回其發(fā)送的字節(jié)數(shù)。sctp_sendmsg()?函數(shù)將在出現(xiàn)錯(cuò)誤時(shí)返回 -1。

如果在?s?參數(shù)中傳遞的文件描述符無效,則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EBADF。如果在?s?參數(shù)中傳遞的文件描述符沒有描述套接字,則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?ENOTSOCK。如果?flags?參數(shù)包括值?MSG_OOB,則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EOPNOTSUPP。如果一對(duì)一風(fēng)格套接字的?flags?參數(shù)包括?MSG_ABORT?或?MSG_EOF值,則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EOPNOTSUPP。如果沒有建立關(guān)聯(lián),則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?ENOTCONN。如果套接字關(guān)閉,禁止進(jìn)一步寫入,則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EPIPE。如果套接字為非阻止套接字并且傳輸隊(duì)列已滿,則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EAGAIN。

如果控制消息長(zhǎng)度不正確,則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。如果指定的目標(biāo)地址不屬于關(guān)聯(lián),則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。如果?stream_no?的值不在關(guān)聯(lián)所支持的外發(fā)流數(shù)之內(nèi),則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。如果所指定的目標(biāo)地址的地址族不是?AF_INET?或?AF_INET6,則?sctp_sendmsg()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。

sctp_send()

ssize_t sctp_send(int? s , const void? *msg , size_t? len , const struct sctp_sndrcvinfo? *sinfo , int? flags );?

sctp_send()?函數(shù)可供一對(duì)一及一對(duì)多風(fēng)格套接字使用。sctp_send()?函數(shù)在發(fā)送來自 SCTP 端點(diǎn)的消息時(shí)啟用高級(jí) SCTP 功能。

s

此值指定?socket()?函數(shù)所創(chuàng)建的套接字。

msg

此值包含?sctp_send()?函數(shù)所發(fā)送的消息。

len

此值為消息的長(zhǎng)度,以字節(jié)為單位。

sinfo

此值包含用于發(fā)送消息的參數(shù)。對(duì)于一對(duì)多風(fēng)格套接字,此值可以包含消息所發(fā)送到的關(guān)聯(lián) ID。

flags

此值與?sendmsg()?函數(shù)中的標(biāo)志參數(shù)相同。

sctp_send()?函數(shù)將返回其發(fā)送的字節(jié)數(shù)。sctp_send()?函數(shù)將在出現(xiàn)錯(cuò)誤時(shí)返回 -1。

如果在?s?參數(shù)中傳遞的文件描述符無效,則?sctp_send()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EBADF。如果在?s?參數(shù)中傳遞的文件描述符沒有描述套接字,則?sctp_send()?函數(shù)將失敗,并將?errno?的值設(shè)置為?ENOTSOCK。如果?sinfo?參數(shù)的?sinfo_flags?字段包括值?MSG_OOB,則?sctp_send()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EOPNOTSUPP。如果一對(duì)一風(fēng)格套接字中?sinfo?參數(shù)的?sinfo_flags?字段包括?MSG_ABORT?或?MSG_EOF?值,則?sctp_send()?函數(shù)將失敗,并將?errno?值的設(shè)置為?EOPNOTSUPP。如果沒有建立關(guān)聯(lián),則?sctp_send()?函數(shù)將失敗,并將?errno?的值設(shè)置為?ENOTCONN。如果套接字關(guān)閉,禁止進(jìn)一步寫入,則?sctp_send()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EPIPE。如果套接字為非阻止套接字并且傳輸隊(duì)列已滿,則?sctp_send()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EAGAIN。

如果控制消息長(zhǎng)度不正確,則?sctp_send()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。如果指定的目標(biāo)地址不屬于關(guān)聯(lián),則?sctp_send()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。如果?stream_no?的值不在關(guān)聯(lián)所支持的外發(fā)流數(shù)之內(nèi),則?sctp_send()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。如果所指定的目標(biāo)地址的地址族不是?AF_INET?或?AF_INET6,則?sctp_send()?函數(shù)將失敗,并將?errno?的值設(shè)置為?EINVAL。

分叉關(guān)聯(lián)

應(yīng)用程序可以將一對(duì)多風(fēng)格套接字上已建立的關(guān)聯(lián)分叉為獨(dú)立的套接字和文件描述符。對(duì)于具有多個(gè)偶發(fā)消息發(fā)送者或接收者的應(yīng)用程序,如果這些發(fā)送者或接收者需要存在于原始一對(duì)多風(fēng)格套接字之下,則獨(dú)立的套接字和文件描述符非常有用。應(yīng)用程序會(huì)將傳輸大量數(shù)據(jù)通信流量的關(guān)聯(lián)分叉為獨(dú)立的套接字描述符。應(yīng)用程序使用?sctp_peeloff()?調(diào)用將關(guān)聯(lián)分叉為獨(dú)立的套接字。新套接字為一對(duì)一風(fēng)格套接字。sctp_peeloff()?函數(shù)的語法如下:

int sctp_peeloff(int? sock , sctp_assoc_t? id );?
sock

從?socket()?系統(tǒng)調(diào)用返回的原始一對(duì)多風(fēng)格套接字描述符

id

要分叉為獨(dú)立的文件描述符的關(guān)聯(lián)的標(biāo)識(shí)符

如果在?sock?參數(shù)中傳遞的套接字描述符不是一對(duì)多風(fēng)格 SCTP 套接字,則?sctp_peeloff()?函數(shù)將失敗并返回?EOPTNOTSUPP。如果?id?的值為 0 或者?id?的值大于在?sock?參數(shù)中傳遞的套接字描述符的最大關(guān)聯(lián)數(shù),則?sctp_peeloff()?函數(shù)將失敗并返回?EINVAL。如果?sctp_peeloff()函數(shù)無法創(chuàng)建新的用戶文件描述符或文件結(jié)構(gòu),則此函數(shù)將失敗并返回?EMFILE。

sctp_getpaddrs()

sctp_getpaddrs()?函數(shù)將返回關(guān)聯(lián)中的所有對(duì)等地址。

int sctp_getpaddrs(int? sock , sctp_assoc_t? id , void? **addrs );?

當(dāng)?sctp_getpaddrs()?函數(shù)成功返回時(shí),**addrs?參數(shù)的值將指向每個(gè)地址相應(yīng)類型的動(dòng)態(tài)分配的壓縮?sockaddr?結(jié)構(gòu)數(shù)組。調(diào)用線程使用?sctp_freepaddrs()?函數(shù)釋放內(nèi)存。**addrs?參數(shù)的值不能為?NULL。如果?sock?中給定的套接字描述符用于 IPv4 套接字,則?sctp_getpaddrs()?函數(shù)將返回 IPv4 地址。如果?sock?中給定的套接字描述符用于 IPv6 套接字,則?sctp_getpaddrs()?函數(shù)將同時(shí)返回 IPv4 和 IPv6 地址。對(duì)于一對(duì)多風(fēng)格套接字,id?參數(shù)指定要查詢的關(guān)聯(lián)。對(duì)于一對(duì)一風(fēng)格套接字,sctp_getpaddrs()?函數(shù)將忽略?id?參數(shù)。當(dāng)?sctp_getpaddrs()?函數(shù)成功返回時(shí),它將返回關(guān)聯(lián)中的對(duì)等地址數(shù)。如果此套接字上沒有關(guān)聯(lián),則?sctp_getpaddrs()?函數(shù)將返回 0,并且不定義?**addrs?參數(shù)的值。如果出現(xiàn)錯(cuò)誤,則?sctp_getpaddrs()?函數(shù)將返回 -1,并且不定義?**addrs?參數(shù)的值。

如果?sock?參數(shù)中傳遞給?sctp_getpaddrs()?函數(shù)的文件描述符無效,則?sctp_getpaddrs()?函數(shù)將失敗并返回?EBADF。如果?sock?參數(shù)中傳遞給?sctp_getpaddrs()?函數(shù)的文件描述符沒有描述套接字,則?sctp_getpaddrs()?函數(shù)將失敗并返回?ENOTSOCK。如果?sock?參數(shù)中傳遞給?sctp_getpaddrs()?函數(shù)的文件描述符描述了未連接的套接字,則?sctp_getpaddrs()?函數(shù)將失敗并返回?ENOTCONN。

sctp_freepaddrs()

sctp_freepaddrs()?函數(shù)將釋放所有由之前的?sctp_getpaddrs()?調(diào)用所分配的資源。sctp_freepaddrs()?函數(shù)的語法如下:

void sctp_freepaddrs(void? *addrs );?

*addrs?參數(shù)為包含?sctp_getpaddrs()?函數(shù)所返回的對(duì)等地址的數(shù)組。

sctp_getladdrs()

sctp_getladdrs()?函數(shù)將返回套接字上的所有本地綁定的地址。sctp_getladdrs()?函數(shù)的語法如下:

int sctp_getladdrs(int? sock , sctp_assoc_t? id , void? **addrs );?

當(dāng)?sctp_getladdrs()?函數(shù)成功返回時(shí),addrs?的值將指向動(dòng)態(tài)分配的壓縮?sockaddr?結(jié)構(gòu)數(shù)組。sockaddr?結(jié)構(gòu)為每個(gè)本地地址的相應(yīng)類型。調(diào)用應(yīng)用程序使用?sctp_freeladdrs()?函數(shù)釋放內(nèi)存。addrs?參數(shù)的值不能為 NULL。

如果?sd?參數(shù)引用的套接字為 IPv4 套接字,則?sctp_getladdrs()?函數(shù)將返回 IPv4 地址。如果?sd?參數(shù)引用的套接字為 IPv6 套接字,則?sctp_getladdrs()?函數(shù)將同時(shí)返回相應(yīng)的 IPv4 或 IPv6 地址。

針對(duì)一對(duì)多風(fēng)格套接字調(diào)用?sctp_getladdrs()?函數(shù)時(shí),id?參數(shù)的值指定要查詢的關(guān)聯(lián)。sctp_getladdrs()?函數(shù)在一對(duì)一套接字上運(yùn)行時(shí)將忽略?id?參數(shù)。

當(dāng)?id?參數(shù)的值為 0 時(shí),無論為何種特定關(guān)聯(lián),sctp_getladdrs()?函數(shù)都將返回本地綁定的地址。當(dāng)?sctp_getladdrs()?函數(shù)成功返回時(shí),它將報(bào)告綁定到套接字的本地地址數(shù)。如果未綁定套接字,則?sctp_getladdrs()?函數(shù)將返回 0,并且不定義?*addrs?的值。如果出現(xiàn)錯(cuò)誤,則?sctp_getladdrs()?函數(shù)將返回 -1,并且不定義?*addrs?的值。

sctp_freeladdrs()

sctp_freeladdrs()?函數(shù)將釋放所有由之前的?sctp_getladdrs()?調(diào)用所分配的資源。sctp_freeladdrs()?函數(shù)的語法如下:

void sctp_freeladdrs(void? *addrs );?

*addrs?參數(shù)為包含?sctp_getladdrs()?函數(shù)所返回的對(duì)等地址的數(shù)組。


總結(jié)

以上是生活随笔為你收集整理的linux网络编程之SCTP套接字常用接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。