- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- C語(yǔ)言sockaddr和sockaddr_in的區別什么是
本篇內容主要講解“C語(yǔ)言sockaddr和sockaddr_in的區別什么是”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強。下面就讓小編來(lái)帶大家學(xué)習“C語(yǔ)言sockaddr和sockaddr_in的區別什么是”吧!
sockaddr在頭文件#include <sys/socket.h>中定義,sockaddr的缺陷是:sa_data把目標地址和端口信息混在一起了,如下:
struct sockaddr { sa_family_t sin_family;//地址族 char sa_data[14]; //14字節,包含套接字中的目標地址和端口信息 };
sockaddr_in在頭文件#include<netinet/in.h>或#include <arpa/inet.h>中定義,該結構體解決了sockaddr的缺陷,把port和addr 分開(kāi)儲存在兩個(gè)變量中,如下:
sin_port和sin_addr都必須是網(wǎng)絡(luò )字節序(NBO),一般可視化的數字都是主機字節序(HBO)。
二者長(cháng)度一樣,都是16個(gè)字節,即占用的內存大小是一致的,因此可以互相轉化。二者是并列結構,指向sockaddr_in結構的指針也可以指向sockaddr。
sockaddr常用于bind、connect、recvfrom、sendto等函數的參數,指明地址信息,是一種通用的套接字地址。
sockaddr_in 是internet環(huán)境下套接字的地址形式。所以在網(wǎng)絡(luò )編程中我們會(huì )對sockaddr_in結構體進(jìn)行操作,使用sockaddr_in來(lái)建立所需的信息,最后使用類(lèi)型轉化就可以了。一般先把sockaddr_in變量賦值后,強制類(lèi)型轉換后傳入用sockaddr做參數的函數:sockaddr_in用于socket定義和賦值;sockaddr用于函數參數。
例子如下:
#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)); //初始化結構體 mysock.sin_family = AF_INET; //設置地址家族 mysock.sin_port = htons(800); //設置端口 mysock.sin_addr.s_addr = inet_addr("192.168.1.0"); //設置地址 bind(sockfd,(struct sockaddr *)&mysock,sizeof(struct sockaddr); /* bind的時(shí)候進(jìn)行轉化 */ ... ... return 0; }
題外話(huà),兩個(gè)函數 htons() 和 inet_addr()。
htons()作用是將端口號由主機字節序轉換為網(wǎng)絡(luò )字節序的整數值。(host to net)
inet_addr()作用是將一個(gè)IP字符串轉化為一個(gè)網(wǎng)絡(luò )字節序的整數值,用于sockaddr_in.sin_addr.s_addr。
inet_ntoa()作用是將一個(gè)sin_addr結構體輸出成IP字符串(network to ascii)。比如:
printf("%s",inet_ntoa(mysock.sin_addr));
htonl()作用和htons()一樣,不過(guò)它針對的是32位的(long),而htons()針對的是兩個(gè)字節,16位的(short)。
與htonl()和htons()作用相反的兩個(gè)函數是:ntohl()和ntohs()。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站