linux网络编程之SCTP套接字常用接口
轉(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)。
此值為初始 RTO 值。
此值為最大 RTO 值。
此值為最小 RTO 值。
返回特定于關(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)。
此值指定關(guān)聯(lián)的最大重新傳輸計(jì)數(shù)。
此值指定對(duì)等方具有的地址數(shù)。
此值指定對(duì)等方接收窗口的當(dāng)前值。
此值指定對(duì)等方傳輸?shù)降纳弦粋€(gè)已報(bào)告的接收窗口。
此值指定關(guān)聯(lián) cookie 的生命周期。可在發(fā)出 cookie 時(shí)使用此值。
所有使用時(shí)間值的參數(shù)均以毫秒為單位。
返回?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)用的缺省流。
此值始終為 0。
此值包含?sendmsg()?調(diào)用的缺省標(biāo)志。此標(biāo)志可以采用以下值:
-
MSG_UNORDERED
-
MSG_ADDR_OVER
-
MSG_ABORT
-
MSG_EOF
-
MSG_PR_SCTP
此值為?sendmsg()?調(diào)用的缺省有效負(fù)荷協(xié)議標(biāo)識(shí)符。
此值為?sendmsg()?調(diào)用的缺省上下文。
此值指定時(shí)間段(以毫秒為單位)。在此時(shí)間段過后,如果消息傳輸尚未開始,則消息將過期。值為 0 指示消息尚未過期。如果設(shè)置了?MSG_PR_SCTP?標(biāo)志,當(dāng)消息傳輸未在?sinfo_timetolive?所指定的時(shí)間段內(nèi)成功完成時(shí),消息將過期。
此值始終為 0。
此值始終為 0。
此值由調(diào)用程序填充。它指定所關(guān)注的關(guān)聯(lián)。
返回所指定對(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)。
此值指定所關(guān)注的對(duì)等地址。
此值指定心跳間隔(以毫秒為單位)。
此值指定在認(rèn)為地址不可訪問之前針對(duì)此地址嘗試的最大重新傳輸數(shù)。
返回有關(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)。
此值為關(guān)聯(lián)的當(dāng)前狀態(tài)。關(guān)聯(lián)可以采用以下狀態(tài):
SCTP_IDLESCTP 端點(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 端點(diǎn)在調(diào)用?bind()?之后綁定到一個(gè)或多個(gè)本地地址。
此端點(diǎn)在等待來自任何遠(yuǎn)程 SCTP 端點(diǎn)的關(guān)聯(lián)請(qǐng)求。
此 SCTP 端點(diǎn)已發(fā)送 INIT 塊并在等待 INIT-ACK 塊。
此 SCTP 端點(diǎn)已將從其對(duì)等方的 INIT-ACK 塊接收的 cookie 回顯到對(duì)等方。
此 SCTP 端點(diǎn)可以與其對(duì)等方交換數(shù)據(jù)。
此 SCTP 端點(diǎn)已從其上層接收了 SHUTDOWN 元語。此端點(diǎn)不再從其上層接受數(shù)據(jù)。
處于 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 端點(diǎn)已從其對(duì)等方接收了 SHUTDOWN 塊。此端點(diǎn)不再從其用戶接受新數(shù)據(jù)。
處于 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)。
此值為關(guān)聯(lián)對(duì)等方的當(dāng)前接收窗口。
此值為未確認(rèn)的 DATA 塊數(shù)。
此值為等待接收的 DATA 塊數(shù)。
此值為傳入的流數(shù)。
此值為外發(fā)的流數(shù)。
如果消息、SCTP 數(shù)據(jù)包頭和 IP 數(shù)據(jù)包頭的組合大小超出?sstat_fragmentation_point?的值,則消息會(huì)分段。此值等于包目標(biāo)地址的路徑最大傳輸單元 (Path Maximum Transmission Unit, P-MTU)。
此值包含有關(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)。
此值為主要對(duì)等地址。
此值可以采用?SCTP_ACTIVE?或?SCTP_INACTIVE?兩個(gè)值中的任意一個(gè)。
此值為對(duì)等地址的擁塞窗口。
此值為對(duì)等地址的當(dāng)前平滑往返時(shí)間計(jì)算結(jié)果,以毫秒為單位。
此值為對(duì)等地址的當(dāng)前重新傳輸超時(shí)值,以毫秒為單位。
此值為對(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ū)的地址。
此參數(shù)為消息緩沖區(qū)的長(zhǎng)度。
此參數(shù)為指向包含發(fā)送主機(jī)地址的地址的指針。
此參數(shù)為與?from?參數(shù)中的地址關(guān)聯(lián)的緩沖區(qū)的大小。
此參數(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)行填充。
此參數(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)。
此值包含?sctp_sendmsg()?函數(shù)所發(fā)送的消息。
此值為消息的長(zhǎng)度,以字節(jié)為單位。
此值為消息的目標(biāo)地址。
此值為目標(biāo)地址的長(zhǎng)度。
此值為應(yīng)用程序指定的有效負(fù)荷協(xié)議標(biāo)識(shí)符。
此值為此消息的目標(biāo)流。
此值為消息未能成功發(fā)送到對(duì)等方的情況下消息過期之前可以等待的時(shí)間段,以毫秒為單位。
如果在發(fā)送消息時(shí)出現(xiàn)錯(cuò)誤,則返回此值。
此值在將邏輯運(yùn)算 OR 以按位形式應(yīng)用于以下零個(gè)或多個(gè)標(biāo)志位時(shí)形成:
MSG_UNORDERED設(shè)置此標(biāo)志之后,sctp_sendmsg()?函數(shù)將無序傳送消息。
設(shè)置此標(biāo)志之后,sctp_sendmsg()?函數(shù)將使用?to?參數(shù)中的地址,而不使用關(guān)聯(lián)的主要目標(biāo)地址。此標(biāo)志僅用于一對(duì)多風(fēng)格 SCTP 套接字。
設(shè)置此標(biāo)志之后,指定的關(guān)聯(lián)將異常中止,同時(shí)向其對(duì)等方發(fā)送 ABORT 信號(hào)。此標(biāo)志僅用于一對(duì)多風(fēng)格 SCTP 套接字。
設(shè)置此標(biāo)志之后,指定的關(guān)聯(lián)將進(jìn)入正常關(guān)機(jī)狀態(tài)。此標(biāo)志僅用于一對(duì)多風(fēng)格 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)建的套接字。
此值包含?sctp_send()?函數(shù)所發(fā)送的消息。
此值為消息的長(zhǎng)度,以字節(jié)為單位。
此值包含用于發(fā)送消息的參數(shù)。對(duì)于一對(duì)多風(fēng)格套接字,此值可以包含消息所發(fā)送到的關(guān)聯(lián) ID。
此值與?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)格套接字描述符
要分叉為獨(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux网络编程之用epoll实现io
- 下一篇: linux之vim常见配置