LINUX--TCP_server端的編寫

1. 解釋套接字

套接字:socket = 主機IP + 主機上的進程(端口號)
標識網絡中的唯一一個進程
Socket:非常類似於電話插座。以一個國家級電話網爲例,電話的通話雙方相當於相互通信的2個進程,區號是它的網絡地址;區內一個單位的交換機相當於一臺主機,主機分配給每個用戶的局內號碼相當於Socket號。任何用戶在通話之前,首先要佔有一部電話機,相當於申請一個Socket;同時要知道對方的號碼,相當於對方有一個固定的Socket。然後向對方撥號呼叫,相當於發出連接請求(假如對方不在同一區內,還要撥對方區號,相當於給出網絡地址)

PS:socket實際上是一個文件描述符,只不過文本描述符走的是io,而socket走的是網絡;

2. TCP: 是建立連接的可靠性傳輸協議

因爲TCP需要建立連接,所以在編程時,需要設置套接字爲監聽,並同時需要多個socket,用於多個用戶同時與client端進行通信。而UDP是不需要建立連接,所以不用設置監聽,client發來數據直接接收。

3. TCP_server端的監聽socket編寫

  1. 創建套接字
    int socket(int domain, int type, int protocol)
    返回 :文件描述符
  2. 套接字綁定
    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
  3. 設置爲監聽套接字
    int listen(int sockfd, int backlog);
  4. 連接確認,創建新的socket用於與用戶通信
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
struct sockaddr_in{
    sa_family_t  sin_family; //類型,AF_INET
    _be16  sin_port;  //端口號
    struct in_addr sin_addr; //
}
struct sin_addr{
    _be32  s_addr; //IP
}

監聽socket的建立:
這裏寫圖片描述

4. TCP_server端在與客戶端建立連接:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
返回一個新的套接字,new_sock用於數據交互;
這裏寫圖片描述

該程序實現簡單的客戶訪問服務器,服務器給客戶反饋信息;但只能同時有一個客戶端的訪問。

5. 可多個用戶同時訪問的服務器,

要實現多用戶可同時訪問服務器,可以簡單的可以利用進程或線程實現,監聽套接字設置沒有改變。
1. 多進程下的TCP_server:

當有新鏈接建立時(accept返回新的sockfd),創建新的子進程,但父進程要等待子進程,所以子進程在關閉了listen_sock後,創建新的子進程就強制退出,子子進程就會變成孤兒進程,在完成通信後系統會處理。
這裏寫圖片描述
這裏寫圖片描述

2. 多線線程下的TCP_server:

當server,client成功建立連接,返回new_sock時,創建新的線程並將new_sock傳過去,新線程與進程分離,在客戶端退出後,關閉文件描述符(new_sock)。而進程繼續等待其他客戶的訪問。
這裏寫圖片描述
這裏寫圖片描述

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