目錄
- 背景
- 基礎
- 流程
- 參考
哦,這里有份不錯的:Linux的SOCKET編程詳解
背景
花了好久的時間(大約一周,我太垃圾)看完了一篇英文文章:Bee'j Guide to Network Programming[1],還有一本書:《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的來了,還失敗了,因為太復雜了,
基礎
在TCP/IP中,一層層的抽象封裝,下層對上層透明不可見,上層都是下層報文格式的資料部分,報頭是一些控制資訊,

Socket編程位于應用層之下、傳輸層之上,分為了Stream Socket和Datagram Socket,其實分別對應了傳輸層的兩種協議,TCP和UDP,不過問題就來了,如果是DCTCP這種高級玩意是怎么搞得呢?以后再說吧,
還有C/S架構,其實兩種架構:P2P以及C/S各有優缺點吧,不過本文只涉及C/S,B/S是C/S的一種特殊情況,P2P我還沒有研究過,C/S架構就是類似下圖:

對了,作者是在*nix平臺做的,Windows只是提了以下:Winsock.h
流程
Socket編程的流程其實不復雜,

這樣整個流程就出來了,就是先創建Socket,然后系結(bind),其實connect()可以代替bind(),不過區別是,bind()系結埠,而connect不關心使用哪個埠,當然是對傳遞的引數來說,connect()會幫程式員找一個未系結埠進行系結,服務器端監聽對這個埠的連接請求,剩下的就是發送、接收資料了,這里注意Stream Socket(使用TCP連接)和Datagram Socket(使用UDP無連接)的發送和接收使用的函式是不同的,最后不要忘了關閉Socket,

其實剩下的主要是去看各個函式都需要哪些引數,怎么使用就好了,在文章的倒數第二章給了man pages,不貼了,理論上下面應該給出一個Client/Server的程式的,但是我覺著沒什么必要,順著我給的連接[1: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>
如果有時間,我學藝更精的時候再來補充,
參考
Beej's Guide to Network Programming ?? ??
OSI模型究竟忽悠了多少人? ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/43044.html
標籤:C
