C語言 sockaddr和sockaddr_in案例詳解
struct sockaddr 和 struct sockaddr_in 這兩個結(jié)構(gòu)體用來處理網(wǎng)絡(luò)通信的地址。
一、sockaddr
sockaddr在頭文件#include <sys/socket.h>中定義,sockaddr的缺陷是:sa_data把目標(biāo)地址和端口信息混在一起了,如下:
struct sockaddr {
sa_family_t sin_family;//地址族
char sa_data[14]; //14字節(jié),包含套接字中的目標(biāo)地址和端口信息
};
二、sockaddr_in
sockaddr_in在頭文件#include<netinet/in.h>或#include <arpa/inet.h>中定義,該結(jié)構(gòu)體解決了sockaddr的缺陷,把port和addr 分開儲存在兩個變量中,如下:

sin_port和sin_addr都必須是網(wǎng)絡(luò)字節(jié)序(NBO),一般可視化的數(shù)字都是主機字節(jié)序(HBO)。
三、總結(jié)
二者長度一樣,都是16個字節(jié),即占用的內(nèi)存大小是一致的,因此可以互相轉(zhuǎn)化。二者是并列結(jié)構(gòu),指向sockaddr_in結(jié)構(gòu)的指針也可以指向sockaddr。
sockaddr常用于bind、connect、recvfrom、sendto等函數(shù)的參數(shù),指明地址信息,是一種通用的套接字地址。
sockaddr_in 是internet環(huán)境下套接字的地址形式。所以在網(wǎng)絡(luò)編程中我們會對sockaddr_in結(jié)構(gòu)體進行操作,使用sockaddr_in來建立所需的信息,最后使用類型轉(zhuǎn)化就可以了。一般先把sockaddr_in變量賦值后,強制類型轉(zhuǎn)換后傳入用sockaddr做參數(shù)的函數(shù):sockaddr_in用于socket定義和賦值;sockaddr用于函數(shù)參數(shù)。
例子如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc,char **argv)
{
int sockfd;
struct sockaddr_in mysock;
sockfd = socket(AF_INET,SOCK_STREAM,0); //獲得fd
bzero(&mysock,sizeof(mysock)); //初始化結(jié)構(gòu)體
mysock.sin_family = AF_INET; //設(shè)置地址家族
mysock.sin_port = htons(800); //設(shè)置端口
mysock.sin_addr.s_addr = inet_addr("192.168.1.0"); //設(shè)置地址
bind(sockfd,(struct sockaddr *)&mysock,sizeof(struct sockaddr); /* bind的時候進行轉(zhuǎn)化 */
... ...
return 0;
}
題外話,兩個函數(shù) htons() 和 inet_addr()。
htons()作用是將端口號由主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序的整數(shù)值。(host to net)
inet_addr()作用是將一個IP字符串轉(zhuǎn)化為一個網(wǎng)絡(luò)字節(jié)序的整數(shù)值,用于sockaddr_in.sin_addr.s_addr。
inet_ntoa()作用是將一個sin_addr結(jié)構(gòu)體輸出成IP字符串(network to ascii)。比如:
printf("%s",inet_ntoa(mysock.sin_addr));
htonl()作用和htons()一樣,不過它針對的是32位的(long),而htons()針對的是兩個字節(jié),16位的(short)。
與htonl()和htons()作用相反的兩個函數(shù)是:ntohl()和ntohs()。

到此這篇關(guān)于C語言 sockaddr和sockaddr_in案例詳解的文章就介紹到這了,更多相關(guān)C語言 sockaddr和sockaddr_in內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一篇文章教你用C語言模擬實現(xiàn)字符串函數(shù)
這篇文章主要介紹了C語言模擬實現(xiàn)字符串函數(shù),開發(fā)程序的時候經(jīng)常使用到一些字符串函數(shù),例如求字符串長度,拷貝字符串……,需要的朋友可以參考下2021-09-09
C++類與對象深入之構(gòu)造函數(shù)與析構(gòu)函數(shù)詳解
朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對我們對C++非常重要的一個知識點做出總結(jié),整理出來一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們在評論區(qū)指出,我們相互學(xué)習(xí),共同進步2022-06-06

