Socke編程簡介

本文系讀書筆記,非深入研究,如非所需,請見諒。

1. 背景

花了好久的時間(大約一週,我太垃圾)看完了一篇英文文章:Bee’j Guide to Network Programming1。還有一本書:《TCP/IP Sockets in C - Practical Guide for Programmers》以及一份PPT:《Introduction to Sockets Programming in C using TCP/IP》,不過後二者沒有看完就是了,也比較老,畢竟我要用的是IPv6,而非IPv4。【更新,現在說的那本書有了第二版,加入了IPv6的內容,中文翻譯:TCP/IP Sockets編程(C語言實現)
其實本科已經學過網絡的書,網絡最重要的不是ISO/OSI,而是TCP/IP,畢竟據老師所說,ISO/OSI是一羣人喝醉酒想出來的,分別對應了7個小矮人2,最後還晚於事實標準TCP/IP,即便按照ISO/OSI的來了,還失敗了,因爲太複雜了。


2. 基礎

在TCP/IP中,一層層的抽象封裝,下層對上層透明不可見,上層都是下層報文格式的數據部分,報頭是一些控制信息。
TCP/IP
Socket編程位於應用層之下、傳輸層之上。分爲了Stream Socket和Datagram Socket,其實分別對應了傳輸層的兩種協議,TCP和UDP。不過問題就來了,如果是DCTCP這種高級玩意是怎麼搞得呢?以後再說吧。
還有C/S架構,其實兩種架構:P2P以及C/S各有優缺點吧,不過本文只涉及C/S,B/S是C/S的一種特殊情況,P2P我還沒有研究過。C/S架構就是類似下圖:
Client-Server Interaction
對了,作者是在*nix平臺做的,Windows只是提了以下:Winsock.h


3. 流程

Socket編程的流程其實不復雜。
Socket Procedure
這樣整個流程就出來了,就是先創建Socket,然後綁定(bind),其實connect()可以代替bind(),不過區別是,bind()綁定端口,而connect不關心使用哪個端口,當然是對傳遞的參數來說,connect()會幫程序員找一個未綁定端口進行綁定。服務器端監聽對這個端口的連接請求,剩下的就是發送、接收數據了,這裏注意Stream Socket(使用TCP連接)和Datagram Socket(使用UDP無連接)的發送和接收使用的函數是不同的。最後不要忘了關閉Socket。
Functions
其實剩下的主要是去看各個函數都需要哪些參數,怎麼使用就好了,在文章的倒數第二章給了man pages,或者參考我的另一篇博客Socket編程基礎API,這裏就不貼了。理論上下面應該給出一個Client/Server的程序的,但是我覺着沒什麼必要。順着我給的博文連接1過去就有很多,不貼了。
不過可以列一下使用的最多的頭文件。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>  	
 	
#include <unistd.h>
#include <sys/socket.h>	
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

如果有時間,我學藝更精的時候再來補充。3

4. 參考


  1. Beej’s Guide to Network Programming ↩︎ ↩︎

  2. OSI模型究竟忽悠了多少人? ↩︎

  3. Linux的SOCKET編程詳解 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章