1. 解釋套接字
套接字:socket = 主機IP + 主機上的進程(端口號)
標識網絡中的唯一一個進程
Socket:非常類似於電話插座。以一個國家級電話網爲例,電話的通話雙方相當於相互通信的2個進程,區號是它的網絡地址;區內一個單位的交換機相當於一臺主機,主機分配給每個用戶的局內號碼相當於Socket號。任何用戶在通話之前,首先要佔有一部電話機,相當於申請一個Socket;同時要知道對方的號碼,相當於對方有一個固定的Socket。然後向對方撥號呼叫,相當於發出連接請求(假如對方不在同一區內,還要撥對方區號,相當於給出網絡地址)
PS:socket實際上是一個文件描述符,只不過文本描述符走的是io,而socket走的是網絡;
2. TCP: 是建立連接的可靠性傳輸協議
因爲TCP需要建立連接,所以在編程時,需要設置套接字爲監聽,並同時需要多個socket,用於多個用戶同時與client端進行通信。而UDP是不需要建立連接,所以不用設置監聽,client發來數據直接接收。
3. TCP_server端的監聽socket編寫
- 創建套接字
int socket(int domain, int type, int protocol)
返回 :文件描述符 - 套接字綁定
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) - 設置爲監聽套接字
int listen(int sockfd, int backlog); - 連接確認,創建新的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)。而進程繼續等待其他客戶的訪問。