網路程式設計中引數的獲得與設定

2021-05-04 07:30:40 字數 2664 閱讀 6672

取得本地主機名:

int gethostname(char *hostname, size_t size);

獲得主機名存到hostname中。

取得本地的資訊:

int getsockname(int sockfd, struct sockaddr *addr, int *addrlen);

addr存有返回的主機資訊。

示例:

struct sockaddr_in sa;

int len = sizeof(sa);

getpeername(sockfd, (struct sockaddr *)&sa, &len);

printf("本地ip:%s", inet_ntoa(sa.sin_addr));

取得對方主機的資訊:

int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);

addr存有返回的主機資訊。

示例:

struct sockaddr_in sa;

int len = sizeof(sa);

getpeername(sockfd, (struct sockaddr *)&sa, &len);

printf("對方ip:%s", inet_ntoa(sa.sin_addr));

獲得dns資訊:

struct hostent *gethostbyname(const char *name);

struct hostent *gethostbyaddr(const char *addr, int len, int type);

返回了乙個指向struct hostent的指標,struct hostent定義如下:

struct hostent ;

#define h_addr h_addr_list[0] /* for backward compatibility */

對於如何獲得dns資訊,將在後面的程式片斷中詳細講解。

dns操作時的錯誤處理與普通程式不同,gethostbyname通過設定h_errno代表出錯號,對應的錯誤函式有hstrerror()和herror(),分別對應於strerror()和perror()這兩個普通的錯誤函式。

獲得或改變socket屬性

int getsockopt(int sockfd, int level, int name, char *value, int *optlen);

int setsockopt(int sockfd, int level, int name, char *value, int *optlen);

對於socket程式設計,level一般為常數sol_socket

name屬性型別,value屬性引數,optlen屬性記憶體塊的長度

常用的有:

so_rcvtimeo,so_sndtimeo:獲得或設定socket傳送/接收的timeout。

so_sndbuf,so_rcvbuf:獲得或設定socket傳送/接收的buffer大小。

so_broadcast:獲得或設定socket狀況,使之可以廣播傳送資料報。(只能用於udp方式)。

so_reuseaddr:設定該socket繫結的埠可以被重用。

注意:在linux系統中,如果乙個socket繫結了某個埠,該socket正常關閉或程式退出後,在一段時間內該埠依然保持被繫結的狀態,其他程式(或者重新啟動的原程式)無法繫結該埠。可以通過呼叫以下語句避免該問題:

opt = 1;

len = sizeof(opt);

setsockopt(sockfd,sol_socket,so_reuseaddr,&opt,&len);

獲得或改變socket的i/o屬性:

int ioctl(int sockfd,long cmd,unsigned long* argp);

cmd屬性型別,argp屬性的引數。

常用的有:

fionread,返回socket緩衝區中未讀資料的位元組數

fionbio,argp為零時為阻塞模式,非零時為非阻塞模式

siocatmark ,判斷是否有未讀的帶外資料(僅用於tcp協議),返回true或false

int fcntl(int fd, int cmd, long arg);

f_setfl,arp為o_nonblock時進入非阻塞模式,為0時進入阻塞模式。

f_getfl,獲得屬性。

ip位址轉換函式:

unsigned long inet_addr (const char *cp);

inet_addr將乙個點分十進位制ip位址字串轉換成32位數字表示的ip位址(網路位元組順序)。

char* inet_ntoa (struct in_addr in);

inet_ntoa將乙個32位數字表示的ip位址轉換成點分十進位制ip位址字串。

這兩個函式互為反函式

位元組順序轉換

htons()--"host to network short"

htonl()--"host to network long"

ntohs()--"network to host short"

ntohl()--"network to host long"

linux 網路的引數及設定

常用網路協議 ipv4 ip32位 二進位制 11111110.11111110.11111110.11111110.254.254.254.254 子網掩碼 用來表示ip的網路位和主機位 網路為表示網路區域 主機位表示網路區域中的某台主機 netmask非0位所對應的ip位址數值為這個ip的網路位...

Linux的網路引數設定

前面講解了llinux 的ip組成,下面就講一下linux的網路設定和資料傳遞。其實這地方對運維的人員來說,不會要精通,但還是要了解。必要時刻還會用到的 電腦之間資料的傳遞 資料的傳遞要分為下面幾層。osi七層模型 應用層 表示層 會話層 傳輸層 網路層 資料鏈路層 物理層 資料封裝過程 mac幀頭...

LoadRunner中引數的設定

loadrunner 中引數的設定 引數個數 10個 tester1 tester2 tester3 tester10 迭代次數 2次 場景設定 一 sequential each iteration 執行結果 vugen中 1個使用者 第一次迭代 iteration 取值為tester1 第二次迭...