在服務器端,socket()返回的套接字用於監聽(listen)和接受(accept),這個套接字不能用於與客戶端之間發送和接收數據。
accept()接受一個客戶端的連接請求,並返回一個新的套接字,不同於以上socket()返回的用於監聽和接受客戶端的連接請求的套接字;與此客戶端通信是通過這個新的套接字上發送和接收數據來完成的。
每個連接進來的客戶端,都會通過accept函數返回一個不同的客戶端的socket對象和屬於客戶端的套接字,代碼如圖
假設一共有3個客戶端連接到服務器端,那么在服務器端就移動有4個套接字,第1個是socket()返回的,用於監聽的套接字;其余3個是分別調用3次accept()返回的不同的套接字。
如果已經有客戶端連接到服務器端,不再需要監聽和接受更多的客戶端連接的時候,可以關閉由socket()返回的套接字,而不會影響與客戶端之間的通信。