0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

TCP編程之網(wǎng)卡信息獲取和域名解析

嵌入式技術(shù) ? 來(lái)源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2023-06-06 11:31 ? 次閱讀

1.TCP/IP簡(jiǎn)介

TCP/IP協(xié)議源于1969年,是針對(duì)Internet開(kāi)發(fā)的一種體系結(jié)構(gòu)和協(xié)議標(biāo)準(zhǔn),目的在于解決異種計(jì)算機(jī)網(wǎng)絡(luò)通信問(wèn)題。使得網(wǎng)絡(luò)在互聯(lián)時(shí)能為用戶提供一種通用、一致的通信服務(wù)。是Internet采用的協(xié)議標(biāo)準(zhǔn)。

TCP/IP是一組通信協(xié)議的代名詞,是由一系列協(xié)議組成的協(xié)議簇。它本身指兩個(gè)協(xié)議集:

TCP(傳輸控制協(xié)議)。
? IP(互聯(lián)網(wǎng)絡(luò)協(xié)議)。

TCP/IP協(xié)議的基本傳輸單位是數(shù)據(jù)包(Datagram)。

TCP/IP傳輸協(xié)議,即傳輸控制/網(wǎng)絡(luò)協(xié)議,也叫作網(wǎng)絡(luò)通訊協(xié)議。它是在網(wǎng)絡(luò)的使用中的最基本的通信協(xié)議。TCP/IP傳輸協(xié)議對(duì)互聯(lián)網(wǎng)中各部分進(jìn)行通信的標(biāo)準(zhǔn)和方法進(jìn)行了規(guī)定。并且,TCP/IP傳輸協(xié)議是保證網(wǎng)絡(luò)數(shù)據(jù)信息及時(shí)、完整傳輸?shù)膬蓚€(gè)重要的協(xié)議。TCP/IP傳輸協(xié)議是嚴(yán)格來(lái)說(shuō)是一個(gè)四層的體系結(jié)構(gòu),應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層都包含其中。

2.獲取本地網(wǎng)卡信息

??獲取本地網(wǎng)卡信息的方法有很多種,在Linux命令行下我們可以通過(guò)ifconfig命令查詢網(wǎng)卡信息。

poYBAGR-oB2AR-W5AATjYDM9kL8576.png

2.1 通過(guò)ioctl函數(shù)獲取網(wǎng)卡信息

??ioctl(input/output control)是一個(gè)專用于設(shè)備輸入輸出操作的系統(tǒng)調(diào)用,該調(diào)用傳入一個(gè)跟設(shè)備有關(guān)的請(qǐng)求碼,系統(tǒng)調(diào)用的功能完全取決于請(qǐng)求碼。

  • ioctl函數(shù)原型:
#include 
int ioctl(int fd, unsigned long request, ...);
形參:fd --文件描述符
      request --請(qǐng)求命令
      第三個(gè)參數(shù)為可變參數(shù),該參數(shù)填寫取決于request 命令;
返回值:一般成功返回0

網(wǎng)絡(luò)相關(guān)的請(qǐng)求劃分為6 類:

  • 接口操作
  • 文件操作
  • 接口操作
  • ARP 高速緩存操作
  • 路由表操作
  • 流系統(tǒng)

下表列出了網(wǎng)絡(luò)相關(guān)ioctl 請(qǐng)求的request 參數(shù)以及arg 地址必須指向的數(shù)據(jù)類型:

wKgZomR-qKKAHjq-AAIzAeIHFhc610.png

獲取網(wǎng)卡信息示例:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main()
{
    int i=0;
	int sockfd;
	/*創(chuàng)建網(wǎng)絡(luò)套接字*/
	if((sockfd = socket(AF_INET, SOCK_STREAM,0))
pYYBAGR-oKqAHSLKAAOg2PVMPHk975.png

3.域名解析

域名(英語(yǔ):Domain Name),又稱網(wǎng)域,是由一串用點(diǎn)分隔的名字組成的Internet上某一臺(tái)計(jì)算機(jī)或計(jì)算機(jī)組的名稱,用于在數(shù)據(jù)傳輸時(shí)對(duì)計(jì)算機(jī)的定位標(biāo)識(shí)(有時(shí)也指地理位置)。

由于IP地址具有不方便記憶并且不能顯示地址組織的名稱和性質(zhì)等缺點(diǎn),人們?cè)O(shè)計(jì)出了域名,并通過(guò)網(wǎng)域名稱系統(tǒng)(DNS,Domain Name System)來(lái)將域名和IP地址相互映射,使人更方便地訪問(wèn)互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP地址數(shù)串。

#include 
extern int h_errno;
struct hostent *gethostbyname(const char *name);
函數(shù)功能:域名解析
形參:name --域名
返回值:
struct hostent {
               char  *h_name;            /* 主機(jī)的正式名稱 */
               char **h_aliases;         /* 別名列表*/
               int    h_addrtype;        /* 主機(jī)地址類型*/
               int    h_length;          /* 地址長(zhǎng)度*/
               char **h_addr_list;       /*地址列表 */
           }
void herror(const char *s); //錯(cuò)誤輸出
const char *hstrerror(int err);//根據(jù)錯(cuò)誤編號(hào)返回錯(cuò)誤消息字符串

示例

#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc,char *argv[])
{
	if(argc!=2)
	{
		printf("格式:./app n");
		return 0;
	}
	//域名解析
	struct hostent *host_info=gethostbyname(argv[1]);
	if(host_info==NULL)
	{
		printf("err=%d,%sn",h_errno,hstrerror(h_errno));
		return 0;
	}
	int i=0;
	struct in_addr addr;
	printf("主機(jī)名:%sn",host_info->h_name);
	for(i=0;host_info->h_aliases[i]!=0;i++)
	{
		printf("主機(jī)別名:%sn",host_info->h_aliases[i]);
	}
	for(i=0;host_info->h_addr_list[i]!=0;i++)
	{
		memcpy(&addr,host_info->h_addr_list[i],sizeof(addr));
		printf("ip地址:%sn",inet_ntoa(addr));
	}
}

運(yùn)行效果:

poYBAGR-p_2AWCYqAACnu8EsZlU312.png

獲取邦定ip地址信息getsockname

getsockname()函數(shù)用于獲取一個(gè)套接字的名字。它用于一個(gè)已捆綁或已連接套接字,本地地址將被返回。本調(diào)用特別適用于如下情況:未調(diào)用bind()就調(diào)用了connect(),這時(shí)唯有g(shù)etsockname()調(diào)用可以獲知系統(tǒng)內(nèi)定的本地地址。在返回時(shí),namelen參數(shù)包含了名字的實(shí)際字節(jié)數(shù)。

#include 
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
函數(shù)功能:獲取sockfd綁定的ip地址和端口號(hào)信息
形  參:sockfd --網(wǎng)絡(luò)套接字
      addr  --保存返回的ip地址和端口號(hào)信息
      addrlen --addr緩沖區(qū)大小(必須由用戶設(shè)置大小,函數(shù)調(diào)用成功返回實(shí)際addr大小)
返回值:成功返回0,失敗-1

示例:

#include 
#include           /* See NOTES */
#include 
#include 
#include 
#include 
#include  /* superset of previous */
#include 
int main(int argc,char *argv[])
{
	if(argc!=3)
	{
		printf("格式:./app  n");
		return 0;
	}
	/*創(chuàng)建網(wǎng)絡(luò)套接字*/
	int sockfd=socket(AF_INET, SOCK_STREAM,0);
	if(sockfd==-1)
	{
		printf("創(chuàng)建網(wǎng)絡(luò)套接字失敗n");
		return 0;
	}
	/*連接服務(wù)器*/
	struct sockaddr_in addr=
	{
		.sin_family=AF_INET,//IPV4
		.sin_port=htons(atoi(argv[1])),//服務(wù)器端口號(hào)
		.sin_addr=
		{
			.s_addr=inet_addr(argv[2]),//服務(wù)器IP
		}
	};
	if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr)))
	{
		printf("連接服務(wù)器失敗n");
		return 0;
	}
	printf("服務(wù)器連接成功n");
	struct sockaddr_in c_addr;
	socklen_t addrlen=sizeof(c_addr);
	getsockname(sockfd,(struct sockaddr *)&c_addr, &addrlen);
	printf("本地信息%s:%dn",inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port));
	while(1)
	{
		
	}
}
pYYBAGR-qHWAacHuAAQhmrabozM011.png
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5059

    文章

    18973

    瀏覽量

    302029
  • 網(wǎng)卡
    +關(guān)注

    關(guān)注

    3

    文章

    301

    瀏覽量

    27312
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3565

    瀏覽量

    93536
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1347

    瀏覽量

    78933
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    esp32連接手機(jī)熱點(diǎn)無(wú)法解析域名是什么原因?

    版本:idf3.3.3 硬件:esp32-worver-e esp32連接手機(jī)熱點(diǎn)后(紅米 note9 pro)成功后。無(wú)法進(jìn)行域名解析。直接使用IP可以進(jìn)行連接。 esp32 連接筆記本熱點(diǎn),無(wú)線路由器等能正常使用域名連接。 這個(gè)是什么原因?是手機(jī)熱點(diǎn)沒(méi)有
    發(fā)表于 06-19 08:02

    為什么我將一個(gè)域名解析到了服務(wù)器的Ip,但是仍然無(wú)法訪問(wèn)?

      有兩個(gè)原因,一個(gè)原因是您的域名解析還沒(méi)有生效,一般解析之后生效的時(shí)間是1-2小時(shí)。請(qǐng)點(diǎn)擊開(kāi)始,選擇運(yùn)行,然后輸入 ping 您的域名地址,比如 ping www.abc.com
    發(fā)表于 11-22 00:38

    [討論]域名解析了,網(wǎng)站卻打不開(kāi)的原因

    域名解析了,網(wǎng)站卻打不開(kāi)的原因 有兩個(gè)原因,一個(gè)原因是您的域名解析還沒(méi)有生效,一般解析之后生效的時(shí)間是1-2小時(shí)。請(qǐng)點(diǎn)擊開(kāi)始,選擇運(yùn)行,然后輸入 ping 您的域名地址,比如 ping
    發(fā)表于 11-25 18:54

    雙線雙IP(多線多IP)域名智能解析教程

    域名DNS的地方即可) 3、選擇 “填寫具體信息”。也就是修改為第三方的DNS解析服務(wù)器。dnspod最新的免費(fèi)DNS為f1g1ns1.dnspod.net
    發(fā)表于 04-18 13:44

    華為mu509支持域名解析嗎?

    最近調(diào)試3G模塊,mu203說(shuō)明書(shū)里AT指令沒(méi)DNS域名解析介紹,請(qǐng)問(wèn)哪位大俠知道它到底支不支持域名解析?還有mu509支持嗎?
    發(fā)表于 07-12 10:07

    mu203有域名解析功能嗎?

    內(nèi)容最近調(diào)試3G模塊,mu203說(shuō)明書(shū)里AT指令沒(méi)DNS域名解析介紹,請(qǐng)問(wèn)哪位大俠知道它到底支不支持域名解析?謝謝
    發(fā)表于 07-12 10:10

    【BPI-M64試用體驗(yàn)】如何判斷網(wǎng)絡(luò)是否公網(wǎng)ip及動(dòng)態(tài)域名解析介紹

    諒。------------------------------------------------------------------------------------------公網(wǎng)ip是全球唯一的,所以你要想在家外訪問(wèn)到家中的計(jì)算機(jī),在不用域名解析的情況下就要求你要有公網(wǎng)ip。內(nèi)網(wǎng)ip是經(jīng)過(guò)網(wǎng)絡(luò)地址轉(zhuǎn)換(N
    發(fā)表于 06-21 01:10

    如何解決DNS解析錯(cuò)誤故障

    沒(méi)有辦法的時(shí)候在用)小知識(shí):每個(gè)windows系統(tǒng)都有個(gè)HOSTS文件,它的作用是加快域名解析,方便局域網(wǎng)用戶,屏蔽網(wǎng)站,順利連接系統(tǒng)等功能。3:清除DNS緩存信息的方法“開(kāi)始->運(yùn)行->
    發(fā)表于 09-29 15:14

    沒(méi)有操作系統(tǒng)真的不能使用LwIP套接字和域名解析嗎?

    裸機(jī)移植了LwIP協(xié)議棧,整體感覺(jué)不錯(cuò)但是在使用套接字(Socket)功能和域名解析(lwip_gethostbyname)時(shí)發(fā)現(xiàn)編譯通不過(guò),說(shuō)是要啟用操作系統(tǒng)。如果不用操作系統(tǒng)就只能用RAW
    發(fā)表于 08-22 22:25

    關(guān)于DDNS動(dòng)態(tài)域名的描述

    上網(wǎng)得到新的動(dòng)態(tài)分配的IP地址之后,程序就會(huì)把這個(gè)IP地址發(fā)送到動(dòng)態(tài)域名解析服務(wù)器,更新域名解析數(shù)據(jù)庫(kù)。Internet上的其他人要訪問(wèn)這個(gè)域名的時(shí)候,動(dòng)態(tài)域名解析服務(wù)器會(huì)返回正確的I
    發(fā)表于 05-30 17:42

    esp32連接手機(jī)熱點(diǎn)無(wú)法解析域名是什么原因?

    版本:idf3.3.3硬件:esp32-worver-e esp32連接手機(jī)熱點(diǎn)后(紅米 note9 pro)成功后。無(wú)法進(jìn)行域名解析。直接使用IP可以進(jìn)行連接。esp32 連接筆記本熱點(diǎn),無(wú)線路由器等能正常使用域名連接。這個(gè)是什么原因?是手機(jī)熱點(diǎn)沒(méi)有
    發(fā)表于 02-16 07:24

    動(dòng)態(tài)域名解析、E-mail的工作原理

    闡述動(dòng)態(tài)域名解析、E-mail 工作原理,重點(diǎn)介紹SMTP 及安全認(rèn)證,在linux 下用動(dòng)態(tài)域名解析與Sendmail+SASL 構(gòu)建安全、經(jīng)濟(jì)而實(shí)用的動(dòng)態(tài)郵件服務(wù)器。為中小企業(yè)、部門架建小型服務(wù)器提
    發(fā)表于 08-06 08:59 ?35次下載

    漢邦高科域名解析教程

    漢邦高科域名解析教程
    發(fā)表于 01-04 14:22 ?0次下載

    漢邦高科域名解析設(shè)置說(shuō)明

    漢邦高科域名解析設(shè)置說(shuō)明
    發(fā)表于 01-04 14:34 ?0次下載

    域名解析是什么意思?

    域名解析是互聯(lián)網(wǎng)基礎(chǔ)設(shè)施中至關(guān)重要的一部分。 域名解析包括兩個(gè)主要的步驟: 1、域名查詢:當(dāng)我們?cè)跒g覽器中輸入一個(gè)域名(例如,www.hengxun.cn),我們的計(jì)算機(jī)首先需要查詢
    的頭像 發(fā)表于 11-21 17:36 ?1954次閱讀