1. 程式人生 > >對網路序和主機序的理解

對網路序和主機序的理解

最近在搞VoIP,在閱讀別人的原始碼時發現了IP地址轉換過程中的問題,寫下筆記。

經驗如下:

1、點分十進位制IP,輸入時以字串的形式讀入;

2、正統的IP地址儲存用 struct in_addr 定義資料結構進行儲存;

3、點分十進位制IP轉化為無符號長整形IP用inet_addr()函式;點分十進位制轉化為struct in_addr結構的網路序IP用inet_aton()反向轉化用inet_ntoa()函式,linux下需要包含兩個標頭檔案:

#include<arpa/inet.h>
#include<netinet/in.h>

4、無符號長整形IP要儲存到in_addr結構體中,可以用memcpy(&addr1,&ulip,4);其中addr1是struct in_addr 結構體,ulip是無符號長整形,inet_ntoa()

函式的形參必須是in_addr結構體陣列,返回值為字元指標。

5、無符號長整形主機序轉網路序用htonl()函式,反向用ntohl()函式;這兩個函式遵循負負得正規律。短整型網路位元組序轉換用htons()ntohs()

6、in_addr結構體定義如下:

struct in_addr {
  union {
          struct { u_char s_b1,s_b2,s_b3,s_b4; }   S_un_b;
          struct { u_short s_w1,s_w2; }            S_un_w;
          u_long                                   S_addr;
  } S_un;
};
7、例項程式碼和演示結果如下:
/*************************************************************************
        > File Name: ipStringTest.c
        > Author:  SunHao
        > Mail:    [email protected]
        > Created Time: 2014年11月26日 星期三 15時32分01秒
 ************************************************************************/

#include<stdio.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>

int main()
{
    char ipStr[50];
    unsigned long ip;
    unsigned long ulip;
    struct in_addr addr1;
    while(1)
    {
        printf("input ip addr:\n");
        scanf("%s",ipStr);
        ip=inet_addr(ipStr);
        printf ("your input ip is:\t%s\n",ipStr);
        ulip=ip;
        memcpy(&addr1,&ulip,4);
        printf("the inet_addr ip:\t\t%x\t%s\n",ulip,inet_ntoa(addr1));
        ulip=htonl(ip);
        memcpy(&addr1,&ulip,4);
        printf("the inet_addr htonl ip:\t\t%x\t%s\n",ulip,inet_ntoa(addr1));
        ulip=ntohl(ulip);
        memcpy(&addr1,&ulip,4);
        printf("the inet_addr ntohl ip:\t\t%x\t%s\n",ulip,inet_ntoa(addr1));
        ulip=htonl(htonl(ip));
        memcpy(&addr1,&ulip,4);
        printf("the inet_addr htonl*2 ip:\t%x\t%s\n",ulip,inet_ntoa(addr1));
    }
    
}

執行結果如下:

input ip addr:
172.16.15.249
your input ip is:       172.16.15.249
the inet_addr ip:               f90f10ac        172.16.15.249
the inet_addr htonl ip:         ac100ff9        249.15.16.172
the inet_addr ntohl ip:         f90f10ac        172.16.15.249
the inet_addr htonl*2 ip:       f90f10ac        172.16.15.249
input ip addr:

相關推薦

網路主機理解

最近在搞VoIP,在閱讀別人的原始碼時發現了IP地址轉換過程中的問題,寫下筆記。 經驗如下: 1、點分十進位制IP,輸入時以字串的形式讀入; 2、正統的IP地址儲存用 struct in_addr 定義資料結構進行儲存; 3、點分十進位制IP轉化為無符號長整形IP用inet

網路位元組主機位元組

不同的CPU有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序最常見的有兩種1. Little endian:將低序位元組儲存在起始地址2. Big endian:將高序位元組儲存在起始地址LE little-endian 最符合人的思維的位元組序地址低位儲存值的低位地址高位儲存值

網路位元組主機位元組詳解!!!

我們都知道,如今的通訊方式已經趨向與多樣化,異構通訊(計算機軟體(作業系統) +    計算機硬體(核心架構,ARM,x86)不同)也已經很普遍了,如,手機和電腦中的qq進行通訊,,, 同時,在計算

建立一棵用二叉樹連結串列方式儲存的二叉樹,並其進行遍歷(先,中),列印輸出遍歷結果

題目如下 程式碼如下 #include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct Node//結構體 {

刷SICP遇到的問題——深入學習理解正則應用

仔細思考了SICP的練習1.5,對正則序和應用序產生了越來越多的問題,這篇部落格不提供解答,只記錄了一些自己的疑惑和思考 最常見的一種正則序應用序的定義方式是,正則序是先展開後規約,應用序是先求值再應用 對於這個定義,產生了幾個問題如下: 展開到什麼程度 什麼順序展開

(1)建立二叉樹的二叉連結串列。 (2)寫出用二叉連結串列儲存的二叉樹進行先、中序和遍歷的遞迴非遞迴演算法。 (3)寫出用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹的所有葉子及結點總數。

(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。 include<stdio.h> #inclu

給出二叉樹的先遍歷,給出後遍歷

logs __main__ font class pre span 思想 style 輸出 實現一個功能: 輸入:一顆二叉樹的先序和中序遍歷 輸出:後續遍歷思想: 先序遍歷中,第一個元素是樹根 在中序遍歷中找到樹根,左邊的是左子樹 右邊的是右子樹

UVA - 10410 Tree Reconstruction (根據dfsbfs恢復一顆樹)

bsp int clu pan n) printf pri 完全 scanf 題意: 分析: 這題一開始完全沒有思路, 一直沒有找出規律。 參考了http://www.cnblogs.com/Wade-/p/6358859.html 和 http://www.cnblog

數據結構 遞歸非遞歸方式實現二叉樹先、中遍歷

nor post 後序遍歷 order else 對象 二叉樹先序 bre print   二叉樹的先序遍歷順序是根、左、右;中序遍歷順序是左、根、右;後序遍歷順序是左、右、根。   遞歸方式實現如下: 1 public class TreeNode { 2

C++實現利用(前生成二叉樹)以及(二叉樹的鏡像)

lse pub 非遞歸 ace 方法 [] reorder spa push #include<iostream> #include<string.h> #include<stack> using namespace std; type

樹的遍歷之----先,中,後遍歷

1先序、中序、後序遍歷(遞迴實現) 先序遍歷:中 左 右 中序遍歷:左 中 右 後序遍歷:左 右 中 public static class Node { public int value; public Node left; public Node right;

Uva536 Tree Recovery二叉樹重建(先確定二叉樹,後輸出)

題目大意:給定二叉樹先序和中序遍歷,輸出二叉樹後序遍歷。 方法:將英文字母對映為數字,利用陣列儲存,先序第一個節點是父節點,然後再從中序遍歷中找到位置。注意邊界。程式碼也很簡單一次ac。 #include<iostream> #include <string> #in

對於給定的先中旬或者中重建樹

//根據先序遍歷結果和中序遍歷結果確定唯一的二叉樹,根據中序遍歷結果和後序遍歷結果確定唯一的二叉樹 import java.util.*; public class Rebuild_Tree { public static void main(String args[]){

LeetCode105 樹·從前序列構造二叉樹(C++)

題目描述: 根據一棵樹的前序遍歷與中序遍歷構造二叉樹。 注意:你可以假設樹中沒有重複的元素。 例如,給出 前序遍歷 preorder = [3,9,20,15,7] 中序遍歷 inorder = [9,3,15,20,7] 返回如下的二叉樹: 3 / \ 9 2

LeetCode106 樹·從中序列構造二叉樹(C++)

題目描述: 根據一棵樹的中序遍歷與後序遍歷構造二叉樹。 注意:你可以假設樹中沒有重複的元素。 例如,給出 中序遍歷 inorder = [9,3,15,20,7] 後序遍歷 postorder = [9,15,7,20,3] 返回如下的二叉樹: 3 / \ 9

c++二叉樹的遞迴非遞迴的前遍歷以及層遍歷

二叉樹的遞迴版的前序,中序和後序遍歷很簡單也很容易理解,這裡就放一個前序遍歷的例子 //前序遍歷遞迴演算法,遞迴演算法都大同小異,這裡就不一一列舉了 void binaryTree::pro_order(NodeStack::Node *t) { NodeStack::Node *h = t;

第六章樹二叉樹作業1—二叉樹--計算機17級 7-1 根據後遍歷輸出先遍歷 (25 分)

7-1 根據後序和中序遍歷輸出先序遍歷 (25 分) 本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。 輸入格式: 第一行給出正整數N(≤30),是樹中結點的個數。隨後兩行,每行給出N個整數,分別對應後序遍歷和中序遍歷結果,數字間以空

Spring IocAOP的理解

轉載自:https://blog.csdn.net/u013148153/article/details/80293587  Ioc和AOP是Spring的兩大核心,面試的時候也經常被問及對這兩個概念的理解,因此也記下我對此的理解,方便以後查漏補缺。  一、控制反轉(Ioc,

根據先(中)確定二叉樹

實在是恨自己智商欠費,一個二叉樹搞了好長時間才弄清!!! 怎樣通過先序和中序確定二叉樹? 我的演算法設計思路參考學習網上的,但程式碼是自己實現的,其實還是在建立二叉樹的基礎上新增一些條件。我們剛開始根據先序序列中第一個資料,在中序序列中找與該結點資料相等的與元素,將中序序列中該元素所在下標返

二叉樹的遞迴遍歷(先、中

  [前文]   二叉樹的遞迴遍歷包括 先序遍歷、中序遍歷 和 後續遍歷。   如下圖所示的二叉樹:        前序遍歷順序為:ABCDE  (先訪問根節點,然後先序遍歷其左子樹,最後先序遍歷其右子樹)   中序遍歷順序為:CBDAE  (先中序遍歷其左子樹,然後訪