https://avatars.githubusercontent.com/u/42119758?v=4

davidlei blog

linux socket programming(二): socket 中用來存放地址的 sockaddr

sockaddr sockaddr 是 socket 的通用地址結構,就如同一開始提到的,socket 除了在網路領域之外,也可以在很多不同的地方用來通訊。 sockaddr 結構,定義如下 typedef unsigned short int sa_family_t; #define __SOCKADDR_COMMON(sa_prefix) \ sa_family_t sa_prefix##family struct sockaddr { __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ char sa_data[14]; /* Address data. */ }; // 上面的結構把巨集展開後,等價於下方的資料結構 struct sockaddr { unsigned short int sa_family; // 2 bytes char sa_data[14]; // 14 bytes }; 後來的更新中,為了讓龐大的程式碼可讀性上升,新增了 sockaddr_in 的結構用來存取網路相關的應用, in 指的是 internet,sockaddr_in 專門用來存 IPv4 的相關地址。 IPv6 則是使用 sockaddr_in6 結構,在本文章主要會著重在 IPv4 相關的範例。

linux socket programming(一): 什麼是 socket & 創建一個新的 socket

socket programming socket 本質上是一種 IPC (Inter-Process Communication) 的技術,用於兩個或多個 process 進行資料交換或者通訊。 在網路領域,socket 著重的不是同一台主機間 process 的通訊,而是不同主機執行的 process 互相交換資料的通訊。 我們在寫 socket programming 的時候會使用 os 提供的 API,來避免重複造輪子,今天的筆記會簡單介紹一下 linux 提供的 socket API,並用兩個簡單的範例介紹如何用 tcp 跟 udp 協定透過 socket 傳輸資料。 本文章所使用的環境 kernel: 5.11.0-37-generic gcc version: gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 GNU Make: 4.2.1 在寫 socket 相關的程式的時候,需要先 #include <arpa/inet.h> // sockaddr 相關 #include <sys/socket.h> socket int socket(int domain, int type, int protocol) domain 定義要建立哪一種類型的 socket,常用的有以下幾種類型 AF_UNIX, AF_LOCAL: 用於本機間 process 的溝通 AF_INET, AF_INET6 AF_INET: IPv4 協定 AF_INET6: IPv6 協定 詳細的選項可以參考 socket 的 man page

jserv - linux 核心設計 第一周題目二解題紀錄

單向 linked list typedef struct __list { int data; struct __list *next; } list; 在不存在環狀結構的狀況下,以下函式能夠對 linked list 元素從小到大排序: 請補完 LL0 ~ LL6 程式碼。 list *sort(list *start) { if (!start || !start->next) return start; list *left = start; list *right = left->next; /* LL0; (a): left->next = NULL; (b): right->next = NULL; (c): left = left->next; (d): left = right->next; */ left = sort(left); right = sort(right); for (list *merge = NULL; left || right; ) { if (!

Circular Doubly linked list 實作 bubble sort

前言 本問題出自於 jserv - Linux 核心設計講座 第一周 linked list 和非連續記憶體操作 底下題目一的延伸題目 在這篇文章會紀錄關於 bubble sort 的實現。 node 結構 struct node { int data; struct node *next, *prev; }; 本題目 linked list 屬於 circular doubly linked list, 所以處理上還需要考慮循環的問題。 swap 之後要把 node 的 prev 跟 next pointer 處理好。 Bubble sort void bubble_sort(int *arr, const int length) { for(int i = 0; i < length-1; i++) { int flag = 0; for(int j = 0; j < length-i-1; j++) { if(arr[j] > arr[j+1]) { int t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t; flag = 1; } } if(!

備份 vscode 環境紀錄

參考 將VS Code 工作環境備份到 GitHub上吧~ 可以將 vscode 的環境快速複製到別台電腦,值得注意的是為了安全考量, github 的 token 最好期限設短一點,等備份完成之後就刪掉。

golang cobra: 在沒有添加任何參數的情況下預設產生 help message

問題描述 最近在使用 cobra 編寫一個簡單的 command line 應用程式,過程中遇到一個之前都沒有想過的問題,把解決方式紀錄在這邊 一般來說用 cobra 寫的程式要顯示詳細的使用教學都要使用 --help 參數,如圖 但是我又想到 golangci-lint 這個工具同樣也是用 cobra 來寫 command line 的應用,卻可以在沒有添加參數的時候跳出 --help 的說明 像是這樣 所以我特別找了一些資料,發現其實解決的方法滿簡單的 解決方法 一般的教學文章在介紹 cobra 的時候都會訂一個 rootCmd 一類的物件,作為你的 command line 應用一開始的 root,之後的指令就會用 rootCmd.AddCommand(功能名稱) 的方式添加進去 所以解決方式很簡單,只要在 rootCmd 定義的地方判斷如果其 args 的長度為零,就呼叫預設的 Help function 即可。 var rootCmd = &cobra.Command{ Use: "leit", Short: "A calendar application in command line.", Long: doc, Run: func(cmd *cobra.Command, args []string) { if len(args) == 0 { _ = cmd.