freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

基于linux網絡編程課程設計(編輯修改稿)

2025-07-15 18:19 本頁面
 

【文章內容簡介】 ckfd = socket ( int domain, int type, intprotocol) , 其中domain 參數指定socket 協(xié)議族, 包括PF_LOACL 和PF_INET, PF_LOACL 表示使用本地套接口, PF_INET 表示使用Internet 套接口。Type 參數定義了套接口的類型, 包括SOCK_STREAM 和SOCK_DGRAM, SOCK_STREAM 指定為流套接口,SOCK_DGRAM指定為數據報套接口。protocol 通常賦值“0”, 意味套接口使用TCP /IP 協(xié)議。socket()調用返回一個整型socket 描述符, 可以在后面的調用使用它, 當其值為 1 時, 說明有錯誤發(fā)生。2) 步驟2: 綁定套接口bind() 當用socket()建立套接口后, 該套接口還是處于無名狀態(tài)的, 無名套接口就象沒有號碼的電話一樣,別人無法向發(fā)送信息( 在同一linux 內核下可實現無名狀態(tài)下通信) 。為了像電話分配電話號碼一樣, 可以通過bind()為建立的套接口綁定一個名字———分配地址。這一步對客戶端不是必需的。int bind ( int sockfd, struct sockaddr _my_addr,int addrlen) 。sockfd 是一個socket 描述符, my_addr 是一個指圖計算機應用向包含有本機IP 地址及端口號等信息的sockaddr 類型的指針。 addrlen 常被設置為sizeof ( structockaddr) , 如果函數調用成功, 就返回0, 否則就返回為 1, 我們可以通過查看errno 的值來了解錯誤的原因。需要指出的是, 可以用下面的賦值實現自動獲得本機IP 地址和隨機獲取一個沒有被占用的端口號:=0; / 系統(tǒng)隨機選擇一個未被使用的端口號 /=INADDR_ANY; / 填入本機IP 地址 / 置為0, 函數會自動為選擇一個未占用的端口來使用。同樣, 置為INADDR_ANY, 系統(tǒng)會自動填入本機IP 地址。bind()函數在成功被調用時返回0。 遇到錯誤時返回“ 1”并將errno 置為相應的錯誤號。另外要注意的是, 當調用函數時, 一般不要將端口號置為小于1024 的值, 因為1~1024 是保留端口號, 可以使用大于1024 中任何一個沒有被占用的端口號。( 3) 步驟3: 請求連接connect()當客戶端綁定地址后, 發(fā)送請求連接信號connect()來與遠端服務器建立一個TCP 連接。connect()函數原型為:int connect ( int sockfd, struct sockaddrserv_addr, int addrlen) 。sockfd 是目的服務器的socket 描述符。 serv_addr是包含目的機IP 地址和端口號的指針, addrlen 為結構的大小。遇到錯誤時返回 1, 并且errno 中包含相應的錯誤碼。進行客戶端程序設計無須調用bind(), 因為這種情況下只需知道目的機器的IP 地址, 而客戶通過哪個端口與服務器建立連接并不需要關心, 內核會自動選擇一個未被占用的端口供客戶端來使用。( 4) 步驟4: 監(jiān)聽連接listen()在服務器端程序中, 當socket 與某一端口捆綁以后, 就需要監(jiān)聽該端口, 以便對到達的服務請求加以處理。 int listen( int sockfd, int backlog) 。sockfd 是Socket 系統(tǒng)調用返回的socket 描述符。backlog 指定在請求隊列中允許的最大請求數, 進入的連接請求將在隊列中等待accept()它們。backlog 對隊列中等待服務的請求的數目進行了限制, 對于小型服務器, 隊列長度應該為5 或是稍大一些的值, 而對于網站服務器, 我們就需要更大的值, 比如說16 或是更大。當listen 遇到錯誤時返回 1, errno 被置為相應的錯誤碼。步驟5: 連接端口的服務請求 當某個客戶端試圖與服務器監(jiān)聽的端口連接時,該連接請求將排隊等待服務器accept()它。通過調用accept()函數為其建立一個連接, accept()函數將返回一個新的socket 描述符, 來供這個新連接來使用。而服務器可以繼續(xù)在以前的那個socket 上監(jiān)聽, 同時可以在新的socket 描述符上進行數據send ()( 發(fā)送) 和recv()( 接收) 操作。int accept( int sockfd, void addr, int addrlen) 。sockfd 是被監(jiān)聽的socket 描述符, addr 通常是一個指向sockaddr_in 變量的指針, 該變量用來存放提出連接請求服務的主機的信息( 某臺主機從某個端口發(fā)出該請求) 。 addrlen 通常為一個指向值為sizeof( struct sockaddr_in) 的整型指針變量。錯誤發(fā)生時返回一個 1 并且設置相應的errno 值。accept()之前, 通常將addrlen 初始化為0。步驟6: 數據傳輸send()和recv()send()和recv()這兩個函數是用于面向連接的socket 上進行數據傳輸。send()函數原型為:int send ( int sockfd, const void msg, int len, intflags) 。sockfd 是想用來傳輸數據的socket 描述符, msg是一個指向要發(fā)送數據( 可以是字符型、整型、浮點型等) 的指針。len 是以字節(jié)為單位的數據的長度。flags一般情況下置為0。 send()函數返回實際上發(fā)送出的字節(jié)數, 可能會少于希望發(fā)送的數據。所以需要對send()的返回值進行測量。當send()返回值與len 不匹配時, 應該對這種情況進行處理。recv()函數原型為:int recv ( int sockfd, void buf, int len, unsignedint flags) 。sockfd 是接收數據的socket 描述符。 buf 是存放接收數據的緩沖區(qū)。 len 是緩沖的長度。flags 也被置為0。recv()返回實際上接收的字節(jié)數, 或當出現錯誤時,返回 1 并置相應的errno 值。 步驟7: 關閉連接close() 當所有的數據操作結束以后, 可以調用close()函數來釋放該socket, 從而停止在該socket 上的任何數據操作。簡要步驟如下:(1)建立一個Socket。(2)按要求配置socket,將socket連接到遠程主機或給socket指定以各本地協(xié)議端口。(3)按要求通過socket發(fā)送和接受數據。(4)關閉此socket。這是通過Socket實現點對點需要掌握的4個編程要點。 上述點對點通信的實現知識完成了主機進程與服務器進程之間的連接,建立連接的進程之間是一對一的聯(lián)系,即主機的一個進程與服務器的一個進程之間建立的連接。而每個進程進行通信的環(huán)節(jié)都包括了發(fā)送信息和接口信息兩個任務,這兩個任務通過一個端口地址發(fā)送和接收。 對于多個并發(fā)的任務需要創(chuàng)建多個線程或線程去實現。使用一個進程去完成發(fā)送信息是沒有問題的,因為發(fā)送總是主動的;而使用同一個進程再去完成接受信息去不一定會成功,因為接受信息是被動的,所以當沒有信息可以接收時,該進程就會被阻塞,從而導致發(fā)送任務也一起被阻塞。同一個端口的發(fā)送和接收是兩個并發(fā)任務,應該由兩個不同的任務去分別完成信息的發(fā)送和接收。這樣,當接收信息任務因沒有信息而被阻塞時,不至于影響發(fā)送任務的執(zhí)行。那么,發(fā)送和接收兩個任務是使用兩個進程還是兩個進程去完成呢?在網絡通信中,端口地址是以進程為單位進程分配的,而一個進程與外界的消息發(fā)送與接收必須通過分配給它的同一個端口進行。因此,不能通過創(chuàng)建進程方式來解決上訴問題,因為兩個進程會分別對應兩個不同的端口,而發(fā)送和接收必須使用同一端口。線程不是資源分配的單位,所以如果使用兩個線程不會對線程分配新的端口。因此,本實驗需要使用兩個線程去分別完成發(fā)送和接收信息的任務,這兩個線程共享其進程擁有的統(tǒng)一個端口地址。由于創(chuàng)建進程的進程本身會作為一個線程來調度,所以只需要再創(chuàng)建一個線程專門負責接收信息就可以了。因此,對于從每個客戶端發(fā)來的請求,服務器端都要創(chuàng)建相應的線程去接收并處理;同理,對于客戶端而言,也要創(chuàng)建一個線程去讀取服務器端發(fā)來的信息。六、系統(tǒng)實現 Linux提供的有關Socket的系統(tǒng)調用(1)Socket() 作用:socket函數為客戶機或服務器創(chuàng)建一個sokcet 格式: int socket(int family,int type,int protocol)。 參數說明: Family:表示地址族,可以去AF_UNLX和AF_INT。 其中,AF_UNLX只能夠用于單一的UNIX系統(tǒng)進程間通信。AF_INT是針對Internet的,因而可以允許在遠程主機之間通信,實驗中使用AF_INT。 Type:網絡程序所采用的通信協(xié)議,可以取SOCK_STREAM或SOCK_DGRAM。其中,SOCK_STREAM表明使用的是TCP協(xié)議,這樣提供按順序的、可靠的、雙向、面向連接的比特流;SOCKE_DGRAM表明使用的是UDP協(xié)議,這樣只會提供定長、不可靠、無連接的通信。(2)bind( ) 格式: int bind(int sockfd,struct sockaddr *addr,int addrlen)。 參數說明: Sockfd:socket的文件描述符號。 Sock
點擊復制文檔內容
物理相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1