放假歸來,半個月沒看書了,稍微有些生疏。被安排了新的工作,老的自學任務還需繼續完成。
這一章內容比較多,按小節整理了一下。
一、編碼整數
1.整數型的大小
由通訊過程雙方交換資訊的協議標準引申出了編碼的整數,進而**了各個整數型別的大小(char、int、long、int8_t、uint8_t等)、獲取它們的長度的方法——sizeof()、並且有乙個簡單的程式示例testsizes.c來展示。
2.傳輸順序
多個位元組編碼的整數,是從最高有效位(大端、左端)還是從最低有效位(小端、右端)傳送,也是傳輸雙方需要協調的。大多數協議使用大端順序,因此它也被稱為網路位元組順序。
3.符號擴充套件
利用補碼進行符號擴充套件;不同長度的資料型別複製時的補位。
這一小節使用了乙個例子bruteforcecoding.c來展示如何進行移位和掩碼操作,相當繁瑣。
4.在流中包裝套接字
使用fdopen、fclose、fflush。
5.結構填充
優化結構成員的排列順序可以避免一些不必要的填充。或者,安排額外的結構成員使得其成為可控制的填充部分。
6.字串和文字
利用wcstombs()和mbstowcs()進行寬字元和適於傳輸的字串行之間的轉換。
7.位操作
二、構造、成幀和解析訊息
這一部分是乙個示例。為了便於複習,把各個元件功能注釋一下。與前幾章不同的是,這裡沒有用類似receive()這樣的函式,而是採用流的方式進行處理。
voteclienttcp.c 客戶端,用於傳送請求。請求有兩種,投票和質詢。
voteservertcp.c 伺服器端,接收請求,並根據不同請求,修改或僅查詢伺服器端資料,並回送。
delimframer.c 基於界定符成幀,包含了從流複製位元組到緩衝區直到遇到界定符的getnextmsg( )和根據界定符把緩衝區位元組複製到流中的putmsg( )。
lengthframer.c 基於長度成幀,包含的兩個函式與delimframer.c提供的兩個函式同名,不同的是它們基於長度成幀。此時訊息格式有所不同,按照前面的約定,兩個位元組的字首中儲存了這個訊息的長度。
voteencodingtext.c 基於文字進行訊息編碼,包含把序列轉化為訊息結構的encode( )和把訊息結構轉化為位元組序列的decode( )。其中用到的strtok( )第一次分割後,每次分割都要利用null作為第乙個引數;strtoll( )的用法如下:
longlong
intstrtoll(
const
char
*nptr,
char
**endptr,
intbase
);
//把nptr按照以base為進製進行轉換。endptr非空時把第乙個無效字元存放至endptr。參考資料
voteencodingbin.c 基於二進位制訊息編碼,包含的兩個函式與
voteencodingtext.c提供的兩個函式同名,不同的是使用固定大小的訊息。
這樣,把voteservertcp.c、兩個成幀模組之
一、兩個編碼模組之一以及輔助模組diewithmessage.c、tcpclientutility.c、tcpserverutility.c和addressutility.c一起編譯即可獲得伺服器程式。客戶端同理,兩者需要使用相同的組合。
p.s.第五章程式尚未測試,由於有其它專案需要進行,暫時擱置tcp/ip socket程式設計的學習。
C 初學6 傳送郵件
1 qq郵箱 設定 賬戶 smtp服務開啟 2 webconfig配置傳送郵箱 password為開啟smtp服務時的驗證碼 3 例項化乙個傳送郵件類。mailmessage mailmessage new mailmessage 發件人郵箱位址,方法過載不同,可以根據需求自行選擇。new mail...
網路程式設計 一 傳送郵件
20180627 author wills from email.mime.text import mimetext from smtplib import smtp defmain msg表示郵件正文內容 msg mimetext 哈哈哈哈 1 如果網易相信對網易郵箱服務有未經授權或不當的使用,有...
13 7 應用開發案例四 傳送事件
fabric應用程式除了通過主動查詢來獲取當前已確認的狀態,還可以通過訂閱並監聽事件 event 來獲取交易執行資訊,用於進行交易確認或者審計。本節的例子將展示如何在鏈碼中傳送事件。詳細 可見examples chaincode go eventsender eventsender.go。傳送事件需...