Linux網路程式設計 主要系統呼叫函式

2021-07-16 06:09:57 字數 4137 閱讀 6389

不同機器內部對變數的位元組儲存順序不同,有的採用大端模式,有的採用小端模式

大端模式:高位元組資料存放在低位元組處,低位元組資料存放在高位元組處

小端模式:低位元組資料存放在低位元組處,高位元組資料存放在高位元組處

在網路上傳輸資料時,由於資料傳輸的兩端可能對應不同的硬體平台,採用的儲存位元組順序也可能不一致,因此tcp/ip協議規定了在網路上必須採用網路位元組順序(也就是大端模式)。

資料在傳送到網路之前將其轉換成大端模式,在接受到資料之後再將其轉換成符合接收端主機的儲存模式。

#include

.h>

uint32_t htonl(uint32_t, hostlong);

unit16_t htons(uint16_t, hostshort);

uint32_t ntohl(uint32_t, netlong);

uint16_t ntohs(uint16_t, netshort);

htonl:host to network long,用於將主機unsigned int 型資料轉換成網路位元組順序

htons:host to network short,用於將主機unsigned short 型資料轉換成網路位元組順序

ntohl、ntohs的功能分別與htonl、htons相反。

通常我們習慣使用字串形式的網路位址,但在網路上進行資料通訊時需使用二進位制形式且為網路位元組順序的ip位址。linux為網路位址的格式轉換提供了一系列函式。

#include

#include

#include

int inet_aton(const

char *cp, struct in_addr *inp);

in_addr_t inet_addr(const

char *cp);

in_addr_t inet_network(const

char *cp);

char* inet_ntoa(struct in_addr in);

struct in_addr inet_makeaddr(int net, int host);

in_addr_t inet_lnaof(struct in_addr in);

in_addr_t inet_netof(struct in_addr in);

演示

執行程式,輸入172.17.242.131,執行結果如下:

套接字建立以後,就可以利用它來傳輸資料,但有時可能對套接字的工作方式有特殊的要求,此時就需要修改套接字的屬性。系統提供了套接字選項來控制套接字的屬性,使用函式getsockopt可以獲取套接字的屬性,使用setsockopt可以設定套接字的屬性。

#include

#include

int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);

int setsockopt(int s, int level, int optname, const

void *optval, socklen_t optlen);

s:乙個套接字。

level:進行套接字選項操作的層次,可以取sol_socket(通用套接字)、ipproto_ip(ip層套接字)、ipproto_tcp(tcp層套接字)等值。

optname:套接字選項的名稱。

optval:對於getsockopt(),optval用來存放獲得的套接字選項;對於setsockopt(),optval是待設定的套接字選項的值。

optlen:對於getsockopt(),在呼叫函式前optlen的值為optval指向的空間大小,呼叫完成後其值為optval所儲存的結果的實際大小;對於setsockopt(),optlen是optval選項的長度。

兩個函式執行成功時都返回0,出錯都返回-1。

struct timeval ;
tv_sec指定秒數,tv_usec指定微秒數。超過時間為這兩個時間的和。在某個套接字連線上,若讀或寫超時,則認為接收或傳送資料失敗。

在客戶端/伺服器模型中,伺服器端需要同時處理多個客戶端的連線請求,此時就需要使用多路復用。

select函式可以實現第二種多路復用

#include

#include

#include

#include

int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

n:需要監視的檔案描述符集,腰間使得檔案描述符值為0~n-1。

reafds:指定需要監視的可讀檔案描述符集合,當這個集合中的乙個描述符上有資料到達時,系統將通知呼叫select函式的程式。

writefds:指定需要監視的可寫檔案描述符集合,當這個集合中的某個描述符可以發資料時,程式將收到通知。

exceptfds:指定需要監視的異常檔案描述符集合,當該集合中的乙個描述符發生異常之後,程式將收到通知。

timeout:指定了阻塞時間,如果在這段時間內監視的檔案描述符上都沒有事件發生,則函式select()將返回0。

selcet()設定的要監視的檔案描述符集合中有描述符發生了事件,則select將返回發生時間的檔案描述符的個數。

struct timeval ;
如果將timeout設為null,則函式select將一直被阻塞,直到某個檔案描述符上發生了事件。如果將timeout設為0,則此時相當於非阻塞方式,函式select查詢完檔案描述符集合的狀態後立即返回。如果將timeout設成某一時間值,在這個時間內如果沒有事件發生,函式select將返回;如果在這段時間內有事件發生,程式將收到通知。

fd_clr(int fd, fd_set *set);             //將檔案描述符fd從檔案描述符集set中刪除

fd_isset(int fd, fd_set *set); //測試fd是否在set中

fd_set(int fd, fd_set *set); //在檔案描述符集合set中增加檔案描述符fd

fd_zero(fd_set *set); //將檔案描述符集合set清空

selcet使用示例

由結果看出,執行程式時在1470449704s時按下enter鍵,select立即返回並列印提示資訊。而後再次進入迴圈,在1470449704s重新設定select監視鍵盤動作,這次沒有按鍵,但是select在1470449712s返回 了,也就是說這次阻塞的時間只有8秒而不是10秒。這是因為linux系統對select的實現中會修改引數timeout為剩餘時間,我們第一次在阻塞了2秒後按下鍵盤,剩餘時間為8秒,所以第二次就只阻塞8秒。

Linux系統程式設計 Linux系統呼叫

linux 系統呼叫 庫函式 目錄 系統呼叫概述 系統呼叫的實現 系統呼叫和庫函式的區別 系統呼叫,顧名思義,說的是作業系統提供給使用者程式呼叫的一組 特殊 介面。使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的服務,比如使用者可以通過檔案系統相關的呼叫請求系統開啟檔案 關閉檔案或讀寫檔案...

Linux系統程式設計 Linux系統呼叫

這系統呼叫,顧名思義,說的是作業系統提供給使用者程式呼叫的一組 特殊 介面。使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的服務,比如使用者可以通過檔案系統相關的呼叫請求系統開啟檔案 關閉檔案或讀寫檔案,可以通過時鐘相關的系統呼叫獲得系統時間或設定定時器等。從邏輯上來說,系統呼叫可被看成是...

Linux系統程式設計 系統呼叫

系統呼叫,顧名思義,說的是作業系統提供給使用者程式呼叫的一組 特殊 介面。使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的服務,比如使用者可以通過檔案系統相關的呼叫請求系統開啟檔案 關閉檔案或讀寫檔案,可以通過時鐘相關的系統呼叫獲得系統時間或設定定時器等。從邏輯上來說,系統呼叫可被看成是乙...