linux網(wǎng)絡(luò)編程

socket概念

  • 在Linux中的網(wǎng)絡(luò)編程是通過socket接口來進行的。socket是一種特殊的I/O接口供鸠,它也是一種文件描述符畦贸。它是一種常用的進程之間通信機制,通過它不僅能實現(xiàn)本地機器上的進程之間的通信楞捂,而且通過網(wǎng)絡(luò)能夠在不同機器上的進程之間進行通信薄坏。
  • 每一個socket都用一個半相關(guān)描述{協(xié)議、本地地址寨闹、本地端口}來表示胶坠;
  • 一個完整的套接字則用一個相關(guān)描述{協(xié)議、本地地址繁堡、本地端口沈善、遠程地址、遠程端口}來表示椭蹄。
  • socket也有一個類似于打開文件的函數(shù)調(diào)用闻牡,該函數(shù)返回一個整型的socket描述符,隨后的連接建立绳矩、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^socket來實現(xiàn)的罩润。
  • socket類型
    (1)流式socket(SOCK_STREAM)
    流式套接字提供可靠的、面向連接的通信流翼馆;它用于TCP協(xié)議割以,從而保證了數(shù)據(jù)傳輸?shù)恼_性和順序性。
    (2)數(shù)據(jù)報socket(SOCK_DGRAM)
    數(shù)據(jù)報套接字定義了一種無連接的服務(wù)写妥,數(shù)據(jù)通過相互獨立的報文進行傳輸拳球,是無序的审姓,并且不保證是可靠珍特、無差錯的。它使用數(shù)據(jù)報協(xié)議UDP魔吐。
    (3)原始socket
    原始套接字允許對底層協(xié)議如IP或ICMP進行直接訪問扎筒,它功能強大但使用較為不便莱找,主要用于一些協(xié)議的開發(fā)。
  • socket信息數(shù)據(jù)結(jié)構(gòu)
struct sockaddr 
{
    unsigned short sa_family; /*地址族*/
    char sa_data[14]; /*14字節(jié)的協(xié)議地址嗜桌,包含該socket的IP地址和端口號奥溺。*/
};

struct sockaddr_in 
{
    short int sa_family; /*地址族*/
    unsigned short int sin_port; /*端口號*/
    struct in_addr sin_addr; /*IP地址*/
    unsigned char sin_zero[8]; /*填充0 以保持與struct sockaddr同樣大小*/
}

struct socketaddr_in : struct sockaddr是通用的套接字地址;
struct sockaddr_in則是internet環(huán)境下套接字的地址形式



數(shù)據(jù)存儲優(yōu)先順序的轉(zhuǎn)換

  • 計算機數(shù)據(jù)存儲有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先(稱為大端模式)和低位字節(jié)優(yōu)先(稱為小端模式)骨宠。
  • Internet上數(shù)據(jù)以高位字節(jié)優(yōu)先順序在網(wǎng)絡(luò)上傳輸浮定;計算機中通常使用低位字節(jié)優(yōu)先存儲數(shù)據(jù)
  • 因此需要對這兩個字節(jié)存儲優(yōu)先順序進行相互轉(zhuǎn)化。函數(shù):htons()层亿、ntohs()桦卒、htonl()和ntohl(),分別實現(xiàn)網(wǎng)絡(luò)字節(jié)序和主機字節(jié)序的轉(zhuǎn)化匿又,h代表host方灾,n代表network,s代表short碌更,l代表long裕偿。通常16位的端口號用s代表,而IP地址用l來代表痛单。


地址格式轉(zhuǎn)換

  • 通常用戶在表達地址時采用的是點分十進制表示的數(shù)值(或者是以冒號分開的十進制IPv6地址)嘿棘,而在通常使用的socket編程中所使用的則是二進制值,這就需要將這兩個數(shù)值進行轉(zhuǎn)換旭绒。這里在IPv4中用到的函數(shù)有inet_aton()蔫巩、inet_addr()和inet_ntoa(),而IPv4和IPv6兼容的函數(shù)有inet_pton()和inet_ntop()快压。進制值圆仔。


  • inet_pton()和inet_ntop()函數(shù)中p和n分別代表表達(presentation)和數(shù)值(numeric)。地址的表達格式通常是ASCII字符串蔫劣,數(shù)值格式則是存放到套接字地址結(jié)構(gòu)的二進制值坪郭。
  • inet_ntop
    原型:
    const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
    參數(shù)說明:
    af:IPv4或IPv6協(xié)議選擇,分別設(shè)置成AF_INET或AF_INET6脉幢。
    src:要轉(zhuǎn)化的地址
    dst:轉(zhuǎn)化后的值
    socklen_t cnt:他是所指向緩存區(qū)dst的大小歪沃,避免溢出,如果緩存區(qū)太小無法存儲地址的值嫌松,則返回一個空指針沪曙。
    返回值:成功返回字符串的首地址,錯誤返回NULL;
  • inet_addr
    功能:將一個點分十進制的IP轉(zhuǎn)換成一個長整數(shù)型數(shù)(u_long類型)
    原型:in_addr_t inet_addr(const char *cp);
    參數(shù):字符串萎羔,一個點分十進制的IP地址

名字地址轉(zhuǎn)換

  • 通常液走,人們在使用過程中都不愿意記憶冗長的IP地址,尤其到IPv6時,地址長度多達128位缘眶,那時就更加不可能一次次記憶那么長的IP地址了嘱根。因此,使用主機名將會是很好的選擇巷懈。

  • 在Linux中该抒,同樣有一些函數(shù)可以實現(xiàn)主機名和地址的轉(zhuǎn)化,最為常見的有g(shù)ethostbyname()顶燕、gethostbyaddr()和getaddrinfo()等凑保,它們都可以實現(xiàn)IPv4和IPv6的地址和主機名之間的轉(zhuǎn)化。其中g(shù)ethostbyname()是將主機名轉(zhuǎn)化為IP地址涌攻,gethostbyaddr()則是逆操作愉适,是將IP地址轉(zhuǎn)化為主機名,另外getaddrinfo()還能實現(xiàn)自動識別IPv4地址和IPv6地址癣漆。




    addrinfo結(jié)構(gòu)體常見選項值


  • 主要數(shù)據(jù)結(jié)構(gòu)

struct hostent
{
    char *h_name;/*正式主機名*/
    char **h_aliases;/*主機別名*/
    int h_addrtype;/*地址類型,可設(shè)置维咸,不設(shè)置就默認為AF_INET*/
    int h_length;/*地址字節(jié)長度,可設(shè)置4或6惠爽,不設(shè)就默認為4*/
    char **h_addr_list;/*指向IPv4或IPv6的地址指針數(shù)組*/
}
struct addrinfo
{
    int ai_flags;/*AI_PASSIVE, AI_CANONNAME;*/
    int ai_family;/*地址族*/
    int ai_socktype;/*socket類型*/
    int ai_protocol;/*協(xié)議類型*/
    size_t ai_addrlen;/*地址字節(jié)長度*/
    char *ai_canonname;/*主機名*/
    struct sockaddr *ai_addr;/*socket結(jié)構(gòu)體*/
    struct addrinfo *ai_next;/*下一個指針鏈表*/
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末癌蓖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子婚肆,更是在濱河造成了極大的恐慌租副,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件较性,死亡現(xiàn)場離奇詭異用僧,居然都是意外死亡,警方通過查閱死者的電腦和手機赞咙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門责循,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攀操,你說我怎么就攤上這事院仿。” “怎么了速和?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵歹垫,是天一觀的道長。 經(jīng)常有香客問我颠放,道長排惨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任碰凶,我火速辦了婚禮暮芭,結(jié)果婚禮上鹿驼,老公的妹妹穿的比我還像新娘。我一直安慰自己谴麦,他們只是感情好蠢沿,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布伸头。 她就那樣靜靜地躺著匾效,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恤磷。 梳的紋絲不亂的頭發(fā)上面哼,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音扫步,去河邊找鬼魔策。 笑死,一個胖子當著我的面吹牛河胎,可吹牛的內(nèi)容都是我干的闯袒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼游岳,長吁一口氣:“原來是場噩夢啊……” “哼政敢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胚迫,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤喷户,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后访锻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褪尝,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年期犬,在試婚紗的時候發(fā)現(xiàn)自己被綠了河哑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡龟虎,死狀恐怖灾馒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遣总,我是刑警寧澤睬罗,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站旭斥,受9級特大地震影響容达,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垂券,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一花盐、第九天 我趴在偏房一處隱蔽的房頂上張望羡滑。 院中可真熱鬧,春花似錦算芯、人聲如沸柒昏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽职祷。三九已至,卻和暖如春届囚,著一層夾襖步出監(jiān)牢的瞬間有梆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工意系, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泥耀,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓蛔添,卻偏偏與公主長得像痰催,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迎瞧,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容