1. 程式人生 > >socket中accept()函式的理解

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資訊,兩種都有了),而引數中的

SOCKET   s包含的是伺服器的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())   資料。這就是這個過程!