socket中accept()函式的理解
如果客戶端有連線請求,必須使用下述函式來接受客戶端的請求。
SOCKET accept(
SOCKET s,
struct sockaddr FAR *addr,
int FAR *addrlen
);
addr用於存放客戶端的地址,addrlen在呼叫函式時被設定為addr指向區域的長度,在函式呼叫結束後被設定為實際地址資訊的長度。本函式會阻塞等待知道有客戶端請求到達。
返回值是一個新的套接字描述符,它代表的是和客戶端的新的連線,可以把它理解成是一個客戶端的socket,這個socket包含的是客戶端的ip和port資訊 。(當然這個new_socket會從sockfd中繼承 伺服器的ip和port資訊,兩種都有了),而引數中的
於是之後的send和recv函式中的fd都是指這個 new_fd,也就是
int send(int new_fd, const void *msg, int len, int flags);
int recv(int new_fd, void *buf, int len, unsigned int flags);
即引數其實都是目標fd(就是記錄了客戶端的資訊 ),說明伺服器是從客戶端接收或者傳送給客戶端的。這個和檔案的操作FILE *fp =fopen(); fwrite(fp,xx,xx,xx);是差不多的,這裡的fp代表的也是目標即目標檔名。
這樣,客戶端的 connect函式 ,
int connect (int sockfd, struct sockaddr *serv_addr, int addrlen);
這裡的sockfd 就把客戶端的ip和port ,伺服器的ip和port資訊都有了。所以之後的 send(),recv()都有資訊了。
----------------------------------------------------------------------------------------------------------------------------------------------------------
accept()函式
準備好了,系統呼叫 accept() 會有點古怪的地方的!你可以想象發生 這樣的事情:有人從很遠的地方通過一個你在偵聽 (listen()) 的埠連線 (connect()) 到你的機器。它的連線將加入到等待接受 (accept()) 的佇列 中。你呼叫 accept() 告訴它你有空閒的連線。它將返回一個新的套接字文 件描述符!這樣你就有兩個套接字了,原來的一個還在偵聽你的那個埠, 新的在準備傳送 (send()) 和接收 (
recv()) 資料。這就是這個過程!