天天看點

一起talk C栗子吧( 第一百五十回:C語言執行個體--socket通信接口二)

各位看官們,大家好,上一回中咱們說的是socket通信的例子,這一回咱們繼續說該例子。閑話休提,言歸正轉。讓我們一起talk C栗子吧!

看官們,我們在上一回中介紹了套接字通信過程中使用的系統調用,這些系統調用具有通用性,在任何類型的套接字通信過程中都可以使用它們。今天,我們将介紹一些專門用來通過套接字發送和接收資料的系統調用。這些系統調用的功能十分相似,隻是在操作的細節上不相同。接下來我們分别介紹他們。

發送資料的系統調用

ssize_t send(int sockfd, const void *buf, size_t len, int flags)
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen)
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags)
           
  • 這三個函數函數都是用來發送資料的,它們的功能與write函數的功能相同,隻是發送的方式不同;
  • 這三個函數中的第一個參數都是套接字描述符;
  • 這三個函數中的參數buf都是用來存放資料的緩沖區,參數len表示位于緩沖區中資料的位元組數量;
  • 這三個函數中的flags參數表示發送資料的方式,常用的值是MSG_DONTWAIT,該值表示以非阻塞的方式 發送資料,我們也可以使用0給它指派,此時,發送資料的方式和write函數寫入資料的方式完全相同;flags還有其它的值,這些值與網絡有關,而且會涉及到許多網絡方面的知識,是以我們就不詳細介紹了。
  • sendto函數中的參數dest_addr是資料接收地的位址,參數addr_len是該位址的長度;
  • sendmsg函數中的msg是一種結構體類型的指針,該結構體中的成員包含了其它幾個函數中的參數,比如 通信的位址,還有flags,以及緩沖區位址。此外,它還包含了一些特殊的成員,我們在這裡就不做詳細介紹了,以後遇到的時候再給大家做詳細的介紹。

接收資料的系統調用

ssize_t recv(int sockfd, void *buf, size_t len, int flags)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen)
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
           
  • 這三個函數都是用來接收資料的,它們的功能與read函數的功能相同,隻是接收的方式不同;
  • 這三個函數中的第一個參數都是套接字描述符;
  • 這三個函數中的參數buf都是用來存放資料的緩沖區,參數len表示位于緩沖區中資料的位元組數量;
  • 這三個函數中的flags參數表示發送資料的方式,常用的值是MSG_DONTWAIT,該值表示以非阻塞的方式接收資料,我們也可以使用0給它指派,此時,接收資料的方式和read函數讀取資料的方式完全相同;flags還有其它的值,這些值與網絡有關,而且會涉及到許多網絡方面的知識,是以我們就不詳細介紹了。
  • recvfrom函數中的參數src_addr是資料發送地的位址,參數addr_len是該位址的長度,使用該函數可以擷取到發送資料的伺服器位址,如果不想知道該位址,可以使用空指針;
  • recvmsg函數中的msg是一種結構體類型的指針,該結構體中的成員包含了其它幾個函數中參數,比如通信的位址,還有flags,以及緩沖區位址。此外,它還包含了一些特殊的成員,我們在這裡就不做詳細介紹了,以後遇到的時候再給大家做詳細的介紹。

說了這麼多的函數,大家是不是覺得有些亂,而且面對這麼多的函數,都不知道如何選擇了。接下來我們給一些參考性的建議。

  • 通常情況下,使用流套接字時send/recv函數使用比較多,當然了,也可以使用另外兩種函數。
  • 使用資料報套接字時,sendto/recvfrom函數使用比較多,而send/recv函數就不能使用了,因為它沒有指定通信的位址。
  • sendmsg/recvmsg函數主要用來傳遞多個緩沖區中的資料,它不受套接字類型的限制,使用範圍比較廣。

各位看官,關于socket通信接口的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。

繼續閱讀