5.8. sendto()和recvfrom() ---和我說話,數據報
“這很不錯啊”,你說,“但是你還沒有講無連接數據報套接字呢?” 沒問題,現在我們開始這個內容。
既然數據報套接字不是連接到遠程主機的,那麼在我們發送一個包之前需要什麼信息呢? 不錯,是目標地址!
sendto()函數原型:
int sendto(intsockfd, const void *msg, int len, unsigned int flags,
const struct sockaddr *to, socklen_ttolen);
你已經看到了,除了另外的兩個信息外,其余的和函數 send() 是一樣的。 to 是個指向數據結構 struct sockaddr 的指針,它包含了目的地的IP 地址和端口信息。tolen 可以簡單地設置為sizeof(struct sockaddr)。 和函數 send() 類似,sendto()返回實際發送的字節數(它也可能小於你想要發送的字節數!),或者在錯誤的時候返回-1。
recvfrom()函數原型:
int recvfrom(intsockfd, 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。
摘自 xiaobin_HLJ80的專欄