Tuesday, January 25, 2011

Linux下的網絡編程5

轉:http://cyuyanbiancheng.blog.hexun.com.tw/56997462_d.html
C語言程序設計:Linux下的網絡編程(五)


6. 高級套接字函數

  在前面的幾個部分裏面,我們已經學會了怎麽樣從網絡上讀寫信息了.前面的一些函數(read,write)是網絡程序裏面最基本的函數.也是最原始的通信函數.在這一章裏面,我們一 起來學習網絡通信的高級函數.這一章我們學習另外幾個文件讀寫函數

6.1 recv
send
    recvsend函數提供了和readwrite差不多的功能.不過它們提供 了第四個參數來控制 讀寫操作


  • int recv(int sockfd,void *buf,int len,int flags)
  • int send(int sockfd,void *buf,int len,int flags)  
前面的三個參數和read,write一樣,第四個參數可以是0或者是以下的組合     _______________________________________________________________     | MSG_DONTROUTE | 不查找路由表 |
    | MSG_OOB | 接受或者發送帶外數據 |
    | MSG_PEEK | 查看數據,並不從系統緩衝區移走數據 |
    | MSG_WAITALL | 等待所有數據 |
    |--------------------------------------------------------------|
 

  MSG_DONTROUTE:send函數使用的標誌.這個標誌告訴IP協議.目的主機在本地網絡上面,沒有必要查找路由表.這個標誌一般用網絡診斷和路由程序裏面
  MSG_OOB:表示可以接收和發送帶外的數據.關於帶外數據我們以後會解釋的
  MSG_PEEK:recv函數的使用標誌,表示只是從系統緩衝區中讀取內容,而不清楚系統緩衝 區的內容.這樣下次讀的時候,仍然是一樣的內容.一般在有多個進程讀寫數據時可以使用 這個標誌
  MSG_WAITALL:recv函數的使用標誌,表示等到所有的信息到達時才返回.使用這個標誌的 時候recv回一直阻塞,直到指定的條件滿足,或者是發生了錯誤


            1)當讀到了指定的字節 ,函數正常返回.返回值等於 len 
            2)當讀到了文件的結尾時,函數正常返回.返回值小於 len  
            3)當操作發生錯誤時,返回-1,且設置錯誤為相應的錯誤號(errno) 如果flags0,則和read,write一樣的操作. 


還有其它的幾個選項,不過我們實際上用的很 ,可以查看 Linux Programmer's Manual得到詳細解釋Publish Post
6.2 recvfromsendto  
  這兩個函數一般用在非套接字的網絡程序當中(UDP),我們已經在前面學會了.

6.3 recvmsg
sendmsg
  recvmsgsendmsg可以實現前面所有的讀寫函數的功能.
  • int recvmsg(int sockfd,struct msghdr *msg,int flags)
  • int sendmsg(int sockfd,struct msghdr *msg,int flags)
    struct msghdr {
      void *msg_name;
      int msg_namelen;
      struct iovec *msg_iov;
      int msg_iovlen;
      void *msg_control;
      int msg_controllen;
      int msg_flags;
    };

    struct iovec {
      void *iov_base; /* 緩衝區開始的地址 */
      size_t iov_len; /* 緩衝區的長度 */
    };

  msg_name msg_namelen當套接字是非面向連接時(UDP),它們存儲接收和發送方的地址 信息.msg_name實際上是一個指向struct sockaddr的指針,msg_namelen是結構的長度.當套 接字是面向連接時,這兩個值應設為NULL. 
  msg_iovmsg_iovlen指出接受和發送的緩衝 區內容.msg_iov是一個結構指針,msg_iovlen指出這個結構數組的大小
  msg_controlmsg_controllen這兩個變量是用來接收和發送控制數據時的 msg_flags指定接受和發送
的操作選項.recv,send的選項一樣


6.4 
套接字的關閉
  關閉套接字有兩個函數closeshutdown.close時和我們關閉文件一樣.

6.5 shutdown

  • int shutdown(int sockfd,int howto)
  TCP連接是雙向的(是可讀寫的),當我們使用close,會把讀寫通道都關閉,有時侯我們希 望只關閉一個方向,這個時候我們可以使用shutdown.針對不同的howto,系統回采取不同 的關閉方式

    howto=0這個時候系統會關閉讀通道.但是可以繼續往接字描述符寫.
    howto=1關閉寫通道,和上面相反,著時候就只可以讀了.
    howto=2關閉讀寫通道,close一樣 在多進程程序裏面,如果有幾個子進程共享一個套接 字時,如果我們使用shutdown, 那麽所有的子進程都不能夠操作了,這個時候我們只能夠 使用close來關閉子進程的套接字描述符.

No comments:

Post a Comment