socket的accept函式解析以及伺服器和多個客戶端的埠問題
今天與同學爭執一個話題:由於socket的accept函式在有客戶端連線的時候產生了新的socket用於服務該客戶端,那麼,這個新的socket到底有沒有佔用一個新的埠?
int socket(int domain, int type, int protocol);
struct socket
{
socket_state state;
unsigned long flags;
const struct proto_ops *ops;
struct fasync_struct *fasync_list;
struct file *file;
struct sock *sk;
wait_queue_head_t wait;
short type;
};
struct inet_sock
{
struct sock sk;
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
struct ipv6_pinfo *pinet6;
#endif
__u32 daddr; //IPv4的目的地址。
__u32 rcv_saddr; //IPv4的本地接收地址。
__u16 dport; //目的埠。
__u16 num; //本地埠(主機位元組序)。
…………
}
int connect( int sockfd, const struct sockaddr* server_addr, socklen_t addrlen)
int send( int sockfd, const void *msg,int len,int flags);
int accept(int sockfd, struct sockaddr* addr, socklen_t* len)
因為1、現在使用多路IO複用epoll等,配置好點的伺服器可以支援數十萬個併發連線,埠號為16位,最多才2^16-1,且加上一些常用的埠號不能使用,可用的埠號都沒那麼多。2、現在伺服器大多使用防火牆,防火牆只對特定埠開放。如果accept隨機分配埠號,會不能通過防火牆。
TCP/IP協議中,IP協議是端到端的協議,它只是負責把把資料傳送到端,交付給上層而已。運輸層TCP、UDP加上了埠號,目的是區分不同的應用。其中TCP還實現了流量控制、可靠傳輸等,而UDP只是應該是沒有對IP層資料進行處理了。
在以往的知識中,我知道一個應用程式只能使用一個埠號,如果accept返回的控制程式碼還是使用listen的埠號,那麼怎麼實現通訊呢?如果建立多個連線,應用程式怎麼區收到的資訊來自哪個客戶端呢?
現在才理解到accept返回的控制程式碼建立的連線包括四部分:源IP、源埠號、目的IP、目的埠號。這樣在一個應用程式中,就算和多個客戶端建立連線,在收到資料後,應用程式通過目的IP和目的埠號也能區分是哪一條連線。
通過一個echo伺服器來驗證一下,client和server都在同一臺機器上:
伺服器監聽8000埠,在未建立連線時,可以看到在監聽8000
在通過一個客戶端建立連線後,可以看到建立了一條連線,伺服器端的埠號是8000,監聽的還是8000。
在連線一個客戶端,可以看到建立了兩條連線,伺服器端都是使用8000,監聽的還是8000。
相關文章
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- Python socket的客戶端Python客戶端
- 【windows socket+TCP伺服器客戶端】WindowsTCP伺服器客戶端
- 【windows socket+UDP伺服器客戶端】WindowsUDP伺服器客戶端
- 【windows socket+HTTP伺服器客戶端】WindowsHTTP伺服器客戶端
- 客戶端的socket是否需要bind?客戶端
- C/S(socket、執行緒 實現多個客戶端、伺服器端簡易通訊)執行緒客戶端伺服器
- websocket(多個客戶端)Web客戶端
- C#Socket伺服器與客戶端的開發(3)C#伺服器客戶端
- 客戶端(windows)訪問FTP伺服器遇到的問題(總結)客戶端WindowsFTP伺服器
- xfire 客戶端呼叫webservice的問題客戶端Web
- TSM客戶端的排程問題客戶端
- socket.io 客戶端與伺服器應用客戶端伺服器
- openssl客戶端程式設計:一個不起眼的函式導致的SSL會話失敗問題客戶端程式設計函式會話
- 解析RocketMQ的client客戶端MQclient客戶端
- 2020-09-30Socket 一個伺服器監聽多個客戶端 功能實現伺服器客戶端
- C++客戶端程式(socket)C++客戶端
- JAVA FTP客戶端問題JavaFTP客戶端
- 壓測的話, 壓測客戶端多 IP 和一個 IP 多埠進行壓測有區別嗎?客戶端
- 實現伺服器和客戶端資料互動,Java Socket有妙招伺服器客戶端Java
- ubuntu 下面 svn 伺服器端和客戶端的配置和使用Ubuntu伺服器客戶端
- 如何用Java Socket實現一個簡單的Redis客戶端JavaRedis客戶端
- 【Java】Java多執行緒實現的聊天客戶端和伺服器Java執行緒客戶端伺服器
- oracle客戶端同sap衝突的問題Oracle客戶端
- 關於 WebSocket 和 HTTP 區別的思考以及一個最簡單的 WebSocket 的客戶端和伺服器實現WebHTTP客戶端伺服器
- 藍芽客戶端和伺服器的實現藍芽客戶端伺服器
- 客戶端tnsping不通問題客戶端
- js客戶端資料庫的物件與函式 (轉)JS客戶端資料庫物件函式
- locust 新手問下 locust 自定義一個 socket 客戶端該如何實現客戶端
- 客戶端 post ,get 訪問伺服器客戶端伺服器
- 多listener 埠的問題
- 關於go和資料庫連線,客戶端以及驅動的疑問?Go資料庫客戶端
- socket實現服務端多執行緒,客戶端重複輸入服務端執行緒客戶端
- C#客戶端Redis伺服器的分散式快取C#客戶端Redis伺服器分散式快取
- WebSphere客戶端遷移的一般問題Web客戶端
- UE 客戶端和伺服器上的時間同步客戶端伺服器
- Java Socket程式設計系列(三)開發支援單客戶端訪問的ServerJava程式設計客戶端Server
- UNIX網路程式設計學習(8)--伺服器端顯示客戶端的IP地址和埠號程式設計伺服器客戶端