Linux網路程式設計基礎 二

2021-04-14 22:42:27 字數 2670 閱讀 2282

1、位元組轉換函式

在網路上面有著許多態別的機器,這些機器在表示資料的位元組順序是不同的, 比如i386晶元是低位元組在記憶體位址的低端,高位元組在高階,而alpha晶元卻相反. 為了統一起來,在linux下面,有專門的位元組轉換函式.

unsigned long int htonl(unsigned long int hostlong)

unsigned short int htons(unisgned short int hostshort)

unsigned long int ntohl(unsigned long int netlong) 

unsigned short int ntohs(unsigned short int netshort)

在這四個轉換函式中,h 代表host, n 代表 network.s 代表short l 代表long 第乙個函式的意義是將本機器上的long資料轉化為網路上的long. 其他幾個函式的意義也差不多.

2、ip和網域名稱的轉換

在網路上標誌一台機器可以用ip或者是用網域名稱.那麼我們怎麼去進行轉換呢?

struct hostent *gethostbyname(const char *hostname)

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

在中有struct hostent的定義

struct hostent

#define h_addr h_addr_list[0] /* 主機的第乙個ip位址*/

gethostbyname可以將機器名(如 linux.yessun.com)轉換為乙個結構指標.在這個結構裡面儲存了網域名稱的資訊

gethostbyaddr可以將乙個32位的ip位址(c0a80001)轉換為結構指標.

這兩個函式失敗時返回null 且設定h_errno錯誤變數,呼叫h_strerror()可以得到詳細的出錯資訊

3、字串的ip和32位的ip轉換.

在網路上面我們用的ip都是數字加點(192.168.0.1)構成的, 而在struct in_addr結構中用的是32位的ip, 我們上面那個32位ip(c0a80001)是的192.168.0.1 為了轉換我們可以使用下面兩個函式

int inet_aton(const char *cp,struct in_addr *inp)

char *inet_ntoa(struct in_addr in)

函式裡面 a 代表 ascii n 代表network.第乙個函式表示將a.b.c.d的ip轉換為32位的ip,儲存在 inp指標裡面.第二個是將32位ip轉換為a.b.c.d的格式.

4、服務資訊函式

在網路程式裡面我們有時候需要知道埠.ip和服務資訊.這個時候我們可以使用以下幾個函式

int getsockname(int sockfd,struct sockaddr *localaddr,int *addrlen)

int getpeername(int sockfd,struct sockaddr *peeraddr, int *addrlen)

struct servent *getservbyname(const char *servname,const char *protoname)

struct servent *getservbyport(int port,const char *protoname)

struct servent  

一般我們很少用這幾個函式.對應客戶端,當我們要得到連線的埠號時在connect呼叫成功後使用可得到 系統分配的埠號.對於服務端,我們用inaddr_any填充後,為了得到連線的ip我們可以在accept呼叫成功後 使用而得到ip位址.

在網路上有許多的預設埠和服務,比如埠21對ftp80對應www.為了得到指定的埠號的服務 我們可以呼叫第四個函式,相反為了得到埠號可以呼叫第三個函式.

5、示例程式

/******* ..... (hostname_ip.c) ************/

#include "stdio.h"

#include "stdlib.h"

#include "errno.h"

#include "sys/types.h"

#include "sys/socket.h"

#include "unistd.h"

#include "netinet/in.h"

#include "netdb.h"

int main(int argc ,char **argv)

argv++;

for(;*argv!=null;argv++)

else

if(host==null)

printf("official host name %s ",host->h_name);

printf("name aliases:");

for(alias=host->h_aliases;*alias!=null;alias++)

printf("%s ,",*alias);

printf(" ip address:");

for(alias=host->h_addr_list;*alias!=null;alias++)

printf("%s ,",inet_ntoa(*(struct in_addr *)(*alias)));}}

Linux網路程式設計基礎二

服務套和客戶機的資訊函式 1 位元組轉換函式 在網路上面有著許多態別的機器,這些機器在表示資料的位元組順序是不同的,比如i386晶元是低位元組在記憶體位址的低端,高位元組在高階,而alpha晶元卻相反.為了統一起來,在linux 下面,有專門的位元組轉換函式.unsigned long int ht...

linux網路程式設計基礎 網路基礎

客戶機 client 伺服器 server 模式。需要在通訊兩端各自部署客戶機和伺服器來完成資料通訊。瀏覽器 browser 伺服器 server 模式。只需在一端部署伺服器,而另外一端使用每台pc都預設配置的瀏覽器即可完成資料的傳輸。c s模式 優點缺點 資料快取本地,效率高 工作量大,開發周期更...

網路程式設計基礎《二》

一 通訊基礎 1.tcp通訊流程 伺服器呼叫socket bind listen 完成初始化後,呼叫accept 阻塞等待,處於監聽埠的狀態,客戶端呼叫socket 初始化後,呼叫connect 發出syn段並阻塞等待伺服器響應,伺服器應答乙個syn ack段,客戶端接收到後從connect 返回,...