UNP卷一chapter8 基本UDP套接字程式設計

2021-08-19 17:47:19 字數 2053 閱讀 5650

以下知識點來均來自steven先生所著unp卷一(version3),剛開始學習網路程式設計,如有不正確之處請大家多多指正。

需要注意的是,udp不面向連線,故不需要使用connect函式,但使用connect也是可以的,只是作用不再是三次握手建立連線,其作用表現在檢測非同步錯誤(asychronous error)和繫結目的地ip和port。

#includessize_t recvfrom(int sockfd, void* buff, size_t nbytes, int flags,

struct sockaddr* from, socklen_t* addrlen);//後兩個引數均為值-結果引數,將獲得來自發端的ip位址和及其長度

ssize_t sendto(int sockfd, const void* buff, size_t nbytes, int flags,

const struct sockaddr* to, socklen_t addrlen);//後兩個引數為指定傳送的接收端的ip位址及其長度

//上述函式均返回:若成功則為讀或寫的位元組數,若出錯則為-1

a、伺服器**如下(相對來說,比較簡單,易讀,不再作解釋!)

void dg_echo(int,sa*,socklen_t);

intmain(int argc, char **argv)

void

dg_echo(int sockfd, sa *pcliaddr, socklen_t clilen)

}

b、客戶端**如下

#includevoid dg_cli(file* fp, int sockfd, const sa* pservaddr, socklen_t servlen);

int main(int argc, char** argv)

void dg_cli(file* fp, int sockfd, const sa* pservaddr, socklen_t servlen)

}

udp是乙個不可靠不面向連線的協議,因而當傳送內容大於接收緩衝區時就會產生資料報的丟失。另,當乙個客戶的資料報丟失,此時得不到伺服器的應答,客戶將永遠阻塞於dg_cli函式中的recvfrom呼叫。此時可通過設定超時器防止客戶永久阻塞在recvfrom函式上。但此時,又無法辨別區分請求丟失和應答丟失。

此方法只針對單宿伺服器主機才起作用,多宿主機行不通,具體實現見dg_cli**

#include	"unp.h"

void

dg_cli(file *fp, int sockfd, const sa *pservaddr, socklen_t servlen)

recvline[n] = 0; /* null terminate */

fputs(recvline, stdout);

}}

客戶port一次性繫結,而ip可隨資料報變動

a的ip綁在sockfd上,但資料報從b的ip介面出,則ip報文包含源a的ip,但仍可以b的ip介面出去。即所謂ip資料報將包含乙個不同於外出鏈路ip位址的源ip位址。

檢查是否存在立即可知錯誤(asyc error,非同步錯誤)

記錄對端ip和port(好處就是可以使用wirte和read代替sendto和recvfrom),但不會有三次握手過程

#include	"unp.h"

intmain(int argc, char **argv)

if (fd_isset(listenfd, &rset))

close(connfd); /* parent closes connected socket */

} if (fd_isset(udpfd, &rset))

}}

UNP卷一chapter20 廣播

型別ipv4 ipv6 tcpudp 所標識介面數 遞送到介面數單播y yyy乙個 乙個任播 y 尚沒有y 一組一組中的乙個 多播可選yy 一組一組中的全體廣播y y全體全體表中要點 i 多播支援在ipv4中是可選的,在ipv6中卻是必需的 ii ipv6不支援廣播。使用廣播的任何ipv4應用程式一...

Chapter 8 理解需求

在專案起始階段,要建立基本的理解,包括存在的問題 誰需要解決方案 所期望解決方案的性質 與專案利益相關者和開發人員之間達成初步交流合作的效果。詢問客戶 使用者和其他人 系統或產品的目標是什麼,想要實現什麼,系統和產品如何滿足業務的要求,最終系統或產品如何用於日常工作。在起始和獲取階段獲得的資訊將在細...

Chapter 8 陣列的使用

一 c 一維陣列 語法 datatype arrayname size eg int nums 25 char array of name 30 double curr salary 35 二 陣列的長度可以是常量 const int n 50 int emp id n const int size...