5.8 sendto和recvfrom() ---和我說話,數據報

原文:https://beej.us/guide/bgnet/html/#sendtorecv

 

5.8 sendto和recvfrom() ---和我說話,數據報

       “這很不錯啊”,你說,“但是你還沒有講無連接數據報套接字呢?” 沒問題,現在我們開始這個內容。

既然數據報套接字不是連接到遠程主機的,那麼在我們發送一個包之前需要什麼信息呢? 不錯,是目標地址!

       sendto()函數原型:

int sendto(int sockfd, const void *msg, int len, unsigned int flags,

const struct sockaddr *to, socklen_t tolen);

       你已經看到了,除了另外的兩個信息外,其餘的和函數 send() 是一樣的。

to 是個指向常量結構 struct sockaddr 的指針,它包含了目的地的IP 地址和端口信息。

tolen 可以簡單地設置爲sizeof(struct sockaddr)。

和函數 send() 類似,sendto()返回實際發送的字節數(它也可能小於你想要發送的字節數!),

或者在錯誤的時候返回-1。

       recvfrom()函數原型:

int recvfrom(int sockfd, void *buf, int len, unsigned int flags,

struct sockaddr *from, int *fromlen);

       又一次,除了兩個增加的參數外,這個函數和 recv() 也是一樣的。

from 是一個指向局部數據結構 struct sockaddr 的指針,它的內容是源機器的IP 地址和端口信息。

fromlen 是個 int 型的局部指針,它的初始值爲 sizeof(struct sockaddr)。

函數調用返回後,fromlen保存着實際儲存在 from 中的地址的長度。

recvfrom() 返回收到的字節長度,或者在發生錯誤後返回 -1。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章