<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

TCP編程之網卡信息獲取和域名解析

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2023-06-06 11:31 ? 次閱讀

1.TCP/IP簡介

TCP/IP協議源于1969年,是針對Internet開發的一種體系結構和協議標準,目的在于解決異種計算機網絡通信問題。使得網絡在互聯時能為用戶提供一種通用、一致的通信服務。是Internet采用的協議標準。

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

TCP(傳輸控制協議)。
? IP(互聯網絡協議)。

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

TCP/IP傳輸協議,即傳輸控制/網絡協議,也叫作網絡通訊協議。它是在網絡的使用中的最基本的通信協議。TCP/IP傳輸協議對互聯網中各部分進行通信的標準和方法進行了規定。并且,TCP/IP傳輸協議是保證網絡數據信息及時、完整傳輸的兩個重要的協議。TCP/IP傳輸協議是嚴格來說是一個四層的體系結構,應用層、傳輸層、網絡層和數據鏈路層都包含其中。

2.獲取本地網卡信息

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

poYBAGR-oB2AR-W5AATjYDM9kL8576.png

2.1 通過ioctl函數獲取網卡信息

??ioctl(input/output control)是一個專用于設備輸入輸出操作的系統調用,該調用傳入一個跟設備有關的請求碼,系統調用的功能完全取決于請求碼。

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

網絡相關的請求劃分為6 類:

  • 接口操作
  • 文件操作
  • 接口操作
  • ARP 高速緩存操作
  • 路由表操作
  • 流系統

下表列出了網絡相關ioctl 請求的request 參數以及arg 地址必須指向的數據類型:

wKgZomR-qKKAHjq-AAIzAeIHFhc610.png

獲取網卡信息示例:

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

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

3.域名解析

域名(英語:Domain Name),又稱網域,是由一串用點分隔的名字組成的Internet上某一臺計算機或計算機組的名稱,用于在數據傳輸時對計算機的定位標識(有時也指地理位置)。

由于IP地址具有不方便記憶并且不能顯示地址組織的名稱和性質等缺點,人們設計出了域名,并通過網域名稱系統(DNS,Domain Name System)來將域名和IP地址相互映射,使人更方便地訪問互聯網,而不用去記住能夠被機器直接讀取的IP地址數串。

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

示例

#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("主機名:%sn",host_info->h_name);
	for(i=0;host_info->h_aliases[i]!=0;i++)
	{
		printf("主機別名:%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));
	}
}

運行效果:

poYBAGR-p_2AWCYqAACnu8EsZlU312.png

獲取邦定ip地址信息getsockname

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

#include 
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
函數功能:獲取sockfd綁定的ip地址和端口號信息
形  參:sockfd --網絡套接字
      addr  --保存返回的ip地址和端口號信息
      addrlen --addr緩沖區大小(必須由用戶設置大小,函數調用成功返回實際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;
	}
	/*創建網絡套接字*/
	int sockfd=socket(AF_INET, SOCK_STREAM,0);
	if(sockfd==-1)
	{
		printf("創建網絡套接字失敗n");
		return 0;
	}
	/*連接服務器*/
	struct sockaddr_in addr=
	{
		.sin_family=AF_INET,//IPV4
		.sin_port=htons(atoi(argv[1])),//服務器端口號
		.sin_addr=
		{
			.s_addr=inet_addr(argv[2]),//服務器IP
		}
	};
	if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr)))
	{
		printf("連接服務器失敗n");
		return 0;
	}
	printf("服務器連接成功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
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    4993

    文章

    18357

    瀏覽量

    289923
  • 網卡
    +關注

    關注

    2

    文章

    285

    瀏覽量

    27107
  • 編程
    +關注

    關注

    88

    文章

    3444

    瀏覽量

    92549
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1276

    瀏覽量

    78359
收藏 人收藏

    評論

    相關推薦

    為什么我將一個域名解析到了服務器的Ip,但是仍然無法訪問?

      有兩個原因,一個原因是您的域名解析還沒有生效,一般解析之后生效的時間是1-2小時。請點擊開始,選擇運行,然后輸入 ping 您的域名地址,比如 ping www.abc.com
    發表于 11-22 00:38

    [討論]域名解析了,網站卻打不開的原因

    域名解析了,網站卻打不開的原因 有兩個原因,一個原因是您的域名解析還沒有生效,一般解析之后生效的時間是1-2小時。請點擊開始,選擇運行,然后輸入 ping 您的域名地址,比如 ping
    發表于 11-25 18:54

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

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

    華為mu509支持域名解析嗎?

    最近調試3G模塊,mu203說明書里AT指令沒DNS域名解析介紹,請問哪位大俠知道它到底支不支持域名解析?還有mu509支持嗎?
    發表于 07-12 10:07

    mu203有域名解析功能嗎?

    內容最近調試3G模塊,mu203說明書里AT指令沒DNS域名解析介紹,請問哪位大俠知道它到底支不支持域名解析?謝謝
    發表于 07-12 10:10

    【BPI-M64試用體驗】如何判斷網絡是否公網ip及動態域名解析介紹

    諒。------------------------------------------------------------------------------------------公網ip是全球唯一的,所以你要想在家外訪問到家中的計算機,在不用域名解析的情況下就要求你要有公網ip。內網ip是經過網絡地址轉換(N
    發表于 06-21 01:10

    如何解決DNS解析錯誤故障

    沒有辦法的時候在用)小知識:每個windows系統都有個HOSTS文件,它的作用是加快域名解析,方便局域網用戶,屏蔽網站,順利連接系統等功能。3:清除DNS緩存信息的方法“開始->運行->
    發表于 09-29 15:14

    使用JavaScript代碼在Rapid板子上實現DNS解析域名得到IP地址操作分享!

    ,最終得到該主機名對應的IP地址的過程叫做域名解析(或主機名解析)。在這里,您將了解到如何使用JavaScript代碼在Rapid板子上來實現DNS解析域名得到IP地址。Javascr
    發表于 08-15 04:17

    沒有操作系統真的不能使用LwIP套接字和域名解析嗎?

    裸機移植了LwIP協議棧,整體感覺不錯但是在使用套接字(Socket)功能和域名解析(lwip_gethostbyname)時發現編譯通不過,說是要啟用操作系統。如果不用操作系統就只能用RAW
    發表于 08-22 22:25

    關于DDNS動態域名的描述

    上網得到新的動態分配的IP地址之后,程序就會把這個IP地址發送到動態域名解析服務器,更新域名解析數據庫。Internet上的其他人要訪問這個域名的時候,動態域名解析服務器會返回正確的I
    發表于 05-30 17:42

    esp32連接手機熱點無法解析域名是什么原因?

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

    動態域名解析、E-mail的工作原理

    闡述動態域名解析、E-mail 工作原理,重點介紹SMTP 及安全認證,在linux 下用動態域名解析與Sendmail+SASL 構建安全、經濟而實用的動態郵件服務器。為中小企業、部門架建小型服務器提
    發表于 08-06 08:59 ?35次下載

    漢邦高科域名解析教程

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

    漢邦高科域名解析設置說明

    漢邦高科域名解析設置說明
    發表于 01-04 14:34 ?0次下載

    域名解析是什么意思?

    域名解析是互聯網基礎設施中至關重要的一部分。 域名解析包括兩個主要的步驟: 1、域名查詢:當我們在瀏覽器中輸入一個域名(例如,www.hengxun.cn),我們的計算機首先需要查詢
    的頭像 發表于 11-21 17:36 ?1183次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>