linux socket programming(一): 什麼是 socket & 創建一個新的 socket
Contents
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
type
socket
傳輸資料的手段(communication semantics
)
- SOCK_STREAM: 對應到
tcp
協定 - SOCK_DGRAM: 對應到
udp
協定
protocol
設定通訊協定的號碼,通常在寫的時候會填入 0
,kernel
會根據上面的兩個參數自動選擇合適的協定。
/etc/protocols
可以看到 linux
底下支援的協定
Return Value
成功建立 socket
之後,此函式會返回該 socket
的檔案描述符(socket file descriptor
),在之後的操作可以透過這個回傳值來操作我們建立的 socket
。 如果建立失敗則會回傳 -1(INVALID_SOCKET)
檔案描述符是什麼?
參考資料
建立 socket example
#include <stdio.h>
#include <sys/socket.h>
int main() {
// AF_INET = IPv4
// SOCK_DGRAM = UDP
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
// 檢查是否建立成功
if (socket_fd < 0) {
printf("Fail to create a socket.");
}
// 根據 socker_fd 關閉剛剛創立的 socket
close(socket_fd);
return 0;
}
在 github 參考完整專案