sockaddr和sockaddr_in都是結構體,并且它們的功能都是用來處理網(wǎng)絡通信的地址。網(wǎng)絡中的地址主要有3個方面的屬性:
1、地址類型例如是互聯(lián)網(wǎng)協(xié)議第四版(ipv4)和互聯(lián)網(wǎng)協(xié)議第六版(ipv6)。
2、IP地址,主要有5類分別是A類:(1.0.0.0-126.0.0.0),地址的網(wǎng)絡號取值于1~126之間。一般用于大型網(wǎng)絡。
B類:(128.0.0.0-191.255.0.0),地址的網(wǎng)絡號取值于128~191之間。一般用于中等規(guī)模網(wǎng)絡。
C類:(192.0.0.0-223.255.255.0),地址的網(wǎng)絡號取值于192~223之間。一般用于小型網(wǎng)絡。
D類:是多播地址,地址的網(wǎng)絡號取值于224~239之間。一般用于多路廣播用戶 。
E類:是保留地址,地址的網(wǎng)絡號取值于240~255之間。
3、端口,它就像門牌號一樣,客戶端可以通過ip地址找到對應的服務器端,但是服務器端有很多端口,每個應用程序對應一個端口號,通過類似門牌號的端口號,客戶端才能真正的訪問到該服務器。為了對端口進行區(qū)分,將每個端口進行了編號,這就是端口號,范圍是0---65535。
用于存儲參與(IP)Windows套接字通信的計算機上的一個internet協(xié)議(IP)地址。為了統(tǒng)一地址結構的表示方法 ,統(tǒng)一接口函數(shù),使得不同的地址結構可以被bind()、connect()、recv()、send()等函數(shù)調用。但一般的編程中并不直接對此數(shù)據(jù)結構進行操作,而使用另一個與之等價的數(shù)據(jù)結構sockaddr_in。這是由于Microsoft TCP/IP套接字開發(fā)人員的工具箱僅支持internet地址字段,而實際填充字段的每一部分則遵循sockaddr_in數(shù)據(jù)結構,兩者大小都是16字節(jié),所以二者之間可以進行切換。
sockaddr_in中的in就表示internet也就是網(wǎng)絡地址的意思,它彌補了sockaddr的缺陷,把port(端口號),和addr(目標地址)分開存儲在兩個變量中。
總結
二者長度一樣,都是16個字節(jié),即占用的內存大小是一致的,因此可以互相轉化。二者是并列結構,指向sockaddr_in結構的指針也可以指向sockaddr。
sockaddr常用于bind、connect、recv、send等函數(shù)的參數(shù),指明地址信息,是一種通用的套接字地址。
sockaddr_in 是internet環(huán)境下套接字的地址形式。所以在網(wǎng)絡編程中我們會對sockaddr_in結構體進行操作,使用sockaddr_in來建立所需的信息,最后使用強制類型轉化就可以了。一般先把sockaddr_in變量賦值后,強制類型轉換后傳入用sockaddr做參數(shù)的函數(shù):sockaddr_in用于socket定義和賦值;sockaddr用于函數(shù)參數(shù)。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程