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

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

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

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

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

1.TCP/IP簡介

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

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

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

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

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

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

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

poYBAGR-oB2AR-W5AATjYDM9kL8576.png

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

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

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

網(wǎng)絡相關的請求劃分為6 類:

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

下表列出了網(wǎng)絡相關ioctl 請求的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)絡套接字*/
	if((sockfd = socket(AF_INET, SOCK_STREAM,0))
pYYBAGR-oKqAHSLKAAOg2PVMPHk975.png

3.域名解析

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

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

#include 
extern int h_errno;
struct hostent *gethostbyname(const char *name);
函數(shù)功能:域名解析
形參: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);//根據(jù)錯誤編號返回錯誤消息字符串

示例

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

#include 
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
函數(shù)功能:獲取sockfd綁定的ip地址和端口號信息
形  參:sockfd --網(wǎng)絡套接字
      addr  --保存返回的ip地址和端口號信息
      addrlen --addr緩沖區(qū)大小(必須由用戶設置大小,函數(shù)調(diào)用成功返回實際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)絡套接字*/
	int sockfd=socket(AF_INET, SOCK_STREAM,0);
	if(sockfd==-1)
	{
		printf("創(chuàng)建網(wǎng)絡套接字失敗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
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5052

    文章

    18905

    瀏覽量

    300697
  • 網(wǎng)卡
    +關注

    關注

    3

    文章

    298

    瀏覽量

    27294
  • 編程
    +關注

    關注

    88

    文章

    3541

    瀏覽量

    93462
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1335

    瀏覽量

    78861
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

    華為mu509支持域名解析嗎?

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

    mu203有域名解析功能嗎?

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

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

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

    如何解決DNS解析錯誤故障

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

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

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

    關于DDNS動態(tài)域名的描述

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

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

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

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

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

    漢邦高科域名解析教程

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

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

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

    域名解析是什么意思?

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