TCP/IP、UDP、Socket 這幾個詞彙幾乎是每位後端開發者的必修課。隨著雲端與微服務普及,理解它們的運作機制比以往更重要。本文將由淺入深,釐清概念、關係,並提供完整的 C# 範例代碼。

圖 1:TCP/IP 協定族包含應用層、傳輸層、網路層、連結層
Socket 並非協定,而是應用層與 TCP/IP 協定堆疊之間的抽象介面。它隱藏了協定族的複雜細節,讓開發者只需呼叫 socket()、bind()、listen()、accept()、connect()、send()/recv() 等少數 API 即可進行網路通訊。

圖 2:Socket 位於應用層與傳輸層之間,屬於門面模式
socket() → bind() → listen() → accept()(阻塞等待連線)socket() → connect()(主動連線)send()/recv() 收發資料closesocket()
圖 3:電話撥號類比 — 撥號、接聽、通話、掛斷
#define DEFAULT_PORT 2000
void CServerDlg::OnStart()
{
sockaddr_in local = { AF_INET, htons(DEFAULT_PORT), INADDR_ANY };
m_Listening = socket(AF_INET, SOCK_STREAM, 0);
bind(m_Listening, (LPSOCKADDR)&local, sizeof(local));
listen(m_Listening, 40);
m_hListenThread = CreateThread(NULL, 0, ListenThread, this, 0, &dwThreadID);
}
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpParam)
{
CServerDlg* pDlg = (CServerDlg*)lpParam;
SOCKET Listening = pDlg->m_Listening;
char szBuf[100];
while (true) {
SOCKET ConnectSocket = accept(Listening, (sockaddr*)&ClientAddr, &nLen);
pDlg->Receive(ConnectSocket, szBuf, 100);
pDlg->SetRequestText(szBuf);
strcat(szBuf, " :我是伺服器,收到(");
strcat(szBuf, inet_ntoa(ClientAddr.sin_addr));
strcat(szBuf, ")");
pDlg->Send(ConnectSocket, szBuf, 100);
}
return 0;
}
void CClientDlg::OnSend()
{
sockaddr_in server = { AF_INET, htons(DEFAULT_PORT), inet_addr(szIP) };
SOCKET socketTmp = socket(AF_INET, SOCK_STREAM, 0);
connect(socketTmp, (LPSOCKADDR)&server, sizeof(server));
Send(socketTmp, szText, 100);
Receive(socketTmp, szText, 100);
m_ReplyBtn.SetWindowText(szText);
closesocket(socketTmp);
}
int Receive(SOCKET fd, char *buf, int len) {
int cnt = len, rc;
while (cnt > 0) {
rc = recv(fd, buf, cnt, 0);
if (rc == SOCKET_ERROR) return -1;
if (rc == 0) return len - cnt;
buf += rc; cnt -= rc;
}
return len;
}
int Send(SOCKET fd, char *buf, int len) {
int cnt = len, rc;
while (cnt > 0) {
rc = send(fd, buf, cnt, 0);
if (rc == SOCKET_ERROR) return -1;
if (rc == 0) return len - cnt;
buf += rc; cnt -= rc;
}
return len;
}

圖 4、5:伺服端監聽、客戶端發送/接收介面
Socket 程式設計並不神秘,掌握「連線導向、串流傳輸、阻塞/非阻塞」三大核心概念,配合正確的收發迴圈處理黏包,即可建立穩健的網路應用。建議進一步學習 I/O 多工、非阻塞 I/O、TLS 加密等進階主題。