socket 套接字程式設計筆記 IP位址轉換

2021-08-27 15:35:52 字數 3027 閱讀 5830

網上有很多使用arduion和樹莓派連線yeelink的例子,硬體和軟體的實現方式都非常簡單。通過學習這些例子一下激發我學習嵌入式網路的動力。雖然使用arduion連線yeelink簡單方便穩定可靠,但是依然像使用嵌入式乙太網協議棧連線yeelink,例如mcu使用stm32,網絡卡晶元使用enc28j60,乙太網協議棧使用lwip。雖然這樣做硬體軟體都要複雜的多,但是也多了不少「樂趣」。事情總是要循序漸進,我決定先認真研究socket程式設計,使用pc平台和yeelink交換資料。

windows環境,編譯器為mingw,ide為eclipse。windows環境下的套接字程式設計和linux環境略有區別,但是基本的思路和方法相同。若使用mingw加eclipse的開發方式,需要加入wsock32庫。新增的方法如下:

圖1 新增wsock32庫

通常情況下,ip位址都被寫成以下格式:192.168.1.101或者10.13.11.105。這種形式的ip位址易於理解,但是對於協議處理來說就顯得不是那麼的方便,為了讓ip位址更容易被處理並兼顧網路傳輸中的格式(網路傳輸為大端格式),所以定義了in_addr結構體:

struct in_addr  s_un_b;

struct s_un_w;

u_long s_addr;

} s_un;

#define s_addr s_un.s_addr

#define s_host s_un.s_un_b.s_b2

#define s_net s_un.s_un_b.s_b1

#define s_imp s_un.s_un_w.s_w2

#define s_impno s_un.s_un_b.s_b4

#define s_lh s_un.s_un_b.s_b3

};

在一些網上流傳的套接字**中,經常會看到這樣的**

struct in_addr server_addr

server_addr.s_addr = .....

此處的server_addr為乙個in_addr型別結構體,server_addr代表乙個ip位址。如果理解in_addr型別結構體,也就是把乙個ip位址理解為4個字元,或2個16位長度整數,或1個32位長度的整數。由於in_addr型別結構體中包含乙個共用體。為使程式設計更簡便些可使用

s_addr替代s_un.s_addr,所以便有了server_addr.s_addr這樣的**。in_addr型別結構體一般不單獨出現(除了dns位址解析外),而是存在於sockaddr_in結構體中,sockaddr_in可理解為套接字位址結構體。

ascii形式的ip位址可以和整數形式的ip位址相互相關,在windows平台下可以使用inet_addr和inet_ntoa。

函式原型和輸入輸出引數

unsigned long inet_addr(

_in_ const char *cp

);

函式作用把ascii格式的ip位址(aaa.bbb.ccc.ddd形式)轉換為乙個32位無符號整數。

函式原型和輸入輸出引數

char* far inet_ntoa(

_in_ struct in_addr in

);

函式作用把in_addr型別的ip位址轉換為ascii格式的ip位址(aaa.bbb.ccc.ddd形式)。inet_ntoa中的

n可理解為network,

a可理解為ascii。該函式一般用於列印ip位址。

#include #include #include #include #include int main(int argc, char **argv)

; addr = inet_addr( server_ipaddr);

if ( addr == inaddr_none && addr == inaddr_any )

// 轉換結果(unsigned long)1694607552

printf("轉換結果(unsigned long)%lu\n",addr);

// 測試inet_itoa

// 轉化為ascii字串形式的ip位址

struct in_addr client_ipaddr;

client_ipaddr.s_addr = addr;

// 轉換結果("***.***.***.***") 192.168.1.101

printf( "轉換結果(\"***.***.***.***\") %s" , inet_ntoa( client_ipaddr ) );

return 0;

}

執行結果轉換結果(unsigned long)

1694607552

轉換結果("***.***.***.***")

192.168.1.101

程式分析

首先準備乙個ascii形式的ip位址,例如192.168.1.101。使用inet_addr轉換為乙個32位無符號整數,轉換結果為1694607552。保留該結果並在通過inet_ntoa還原192.168.1.101。還原之前需要先定義in_addr型別結構體,並命名為client_ipaddr,client_ipaddr.s_addr為32位無符號整數可直接賦值。最後使用inet_ntoa對client_ipaddr變數進行格式轉換並通過串列埠列印。

網路程式設計 Socket 套接字

網路程式設計 目前較為流行的網路程式設計模型是客戶機 伺服器 c s 結構。即通訊雙方一方作為服務 器等待客戶提出請求並予以響應。客戶則在需要服務時向伺服器提出申請。伺服器一般作為 守護程序始終執行,監聽網路埠,一旦有客戶請求,就會啟動乙個服務程序來響應該客 戶,同時自己繼續監聽服務埠,使後來的客戶...

socket套接字程式設計函式

呼叫socket函式建立套接字 呼叫bind函式分配ip位址和埠 呼叫listen函式轉為可接收請求狀態 呼叫accept函式受理連線請求 include 成功時返回檔案描述符,失敗時返回 1 int socket int domain,int type,int protocol 協議族 proto...

網路程式設計socket套接字

socket 建立乙個socket,主動套介面。bind 繫結ip和埠號到socket,需先配置ip 埠號。connect 客戶機 client 端和伺服器傳送請求建立連線。listen 伺服器 serv 監聽client傳送的請求。accept 完成連線,阻塞響應。sendto 傳送資料 recv...