網上有很多使用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...