sctp和tcp、udp有些不一樣,在寫應用程式的時候需要注意一下。
1. 可以bind多個ip位址
這個是sctp的特點,兩端都可以用多個ip位址和對端來通訊,因此不管是client端,還是server端,都可以bind多個ip位址(埠號必須相同)。
比如:// bind第乙個位址
bind(fd, (struct sockaddr *)&cliaddr1, sizeof(cliaddr));
// bind第二個位址
sctp_bindx(fd, (struct sockaddr *)&cliaddr2, 1, sctp_bindx_add_addr);
cliaddr1和cliaddr2裡面,ip位址不同,port相同。
2. 需要註冊事件通知
為了能呼叫sctp_recvmsg()收到對端傳送的data,需要事先為該socket註冊乙個事件通知功能:
struct sctp_event_subscribe events;
events.sctp_data_io_event = 1;
setsockopt(fd, sol_sctp, sctp_events, (const void *)&events, sizeof(events));
不註冊這個事件通知,是不能通過呼叫sctp_recvmsg()接收對端的data的。
類似的,註冊其他事件型別之後,可以通過sctp_recvmsg()收到sctp_comm_up(連線建立完成)、sctp_shutdown_event(連線被關閉)等通知。
events.sctp_association_event = 1;
events.sctp_shutdown_event = 1;
sctp_recvmsg()介面使用方法如下:
ret = sctp_recvmsg((int) fd,
(void *)buf,
(size_t)max_buff_size,
(struct sockaddr *)from,
&fromlen,
(struct sctp_sndrcvinfo *)&rcvinfo,
(int *)&l_msg_flags);
通過l_msg_flags就能知道收到的buf中,到底是notification還是data(對端應用層的一條訊息),以及data有沒有接收完整:
if (l_msg_flags & msg_notification)
} else if (l_notif->sn_header.sn_type == sctp_shutdown_event)
}} else if (l_msg_flags & msg_eor) else
IAP 應用程式設計
1 檢查是否需要對第二部分 進行更新 2 如果不需要更新則轉到4 3 執行更新操作 4 跳轉到第二部分 執行 第一部分 必須通過其它手段,如jtag或isp燒入 第二部分 可以使用第一部分 iap功能燒入,也可以和第一部分 一道燒入,以後需要程式更新是再通過第一部分iap 更新。對於stm32來說,...
串列埠應用程式設計
include include 標準輸入輸出定義 include 標準函式庫定義 include unix 標準函式定義 include include include 檔案控制定義 include ppsix 終端控制定義 include 錯誤號定義 include include include...
DirectShow應用程式設計介紹
這篇文章包含兩方面內容 filter graphs 寫乙個dshow應用程式 一 filter graphs dshow的基本軟構件塊是一種叫做filter的元件。a filter一般只執行基於多 資料上的單一的操作。例如,有一些dshow filter有如下功能 1 讀檔案 2 3 為某一種流格式...