1 Socket編程
socket這個(gè)詞可以表示很多概念:
在TCP/IP協(xié)議中,“IP地址+TCP或UDP端口號(hào)”唯一標(biāo)識(shí)網(wǎng)絡(luò)通訊中的一個(gè)進(jìn)程,“IP
地址+端口號(hào)”就稱為socket。
在TCP協(xié)議中,建立連接的兩個(gè)進(jìn)程各自有一個(gè)socket來標(biāo)識(shí),那么這兩個(gè)socket組成的socket pair就唯一標(biāo)識(shí)一個(gè)連接。socket本身有“插座”的意思,因此用來描述網(wǎng)絡(luò)連
接的一對(duì)一關(guān)系。
TCP/IP協(xié)議最早在BSD UNIX上實(shí)現(xiàn),為TCP/IP協(xié)議設(shè)計(jì)的應(yīng)用層編程接口稱為socket
API。
本章的主要內(nèi)容是socketAPI,主要介紹TCP協(xié)議的函數(shù)接口,最后介紹UDP協(xié)議和UNIX Domain Socket的函數(shù)接口。
圖11.1:socketAPI
2 網(wǎng)絡(luò)字節(jié)序
我們已經(jīng)知道,內(nèi)存中的多字節(jié)數(shù)據(jù)相對(duì)于內(nèi)存地址有大端和小端之分,磁盤文件中的
多字節(jié)數(shù)據(jù)相對(duì)于文件中的偏移地址也有大端小端之分。網(wǎng)絡(luò)數(shù)據(jù)流同樣有大端小端之分,
那么如何定義網(wǎng)絡(luò)數(shù)據(jù)流的地址呢?發(fā)送主機(jī)通常將發(fā)送緩沖區(qū)中的數(shù)據(jù)按內(nèi)存地址從低到高的順序發(fā)出,接收主機(jī)把從網(wǎng)絡(luò)上接到的字節(jié)依次保存在接收緩沖區(qū)中,也是按內(nèi)存地址從低到高的順序保存,因此,網(wǎng)絡(luò)數(shù)據(jù)流的地址應(yīng)這樣規(guī)定:先發(fā)出的數(shù)據(jù)是低地址,后發(fā)出的數(shù)據(jù)是高地址。
TCP/IP協(xié)議規(guī)定,網(wǎng)絡(luò)數(shù)據(jù)流應(yīng)采用大端字節(jié)序,即低地址高字節(jié)。例如上一節(jié)的UDP
段格式,地址0-1是16位的源端口號(hào),如果這個(gè)端口號(hào)是1000(0x3e8),則地址0是0x03,
地址1是0xe8,也就是先發(fā)0x03,再發(fā)0xe8,這16位在發(fā)送主機(jī)的緩沖區(qū)中也應(yīng)該是低地址存0x03,高地址存0xe8。但是,如果發(fā)送主機(jī)是小端字節(jié)序的,這16位被解釋成0xe803,而不是1000。因此,發(fā)送主機(jī)把1000填到發(fā)送緩沖區(qū)之前需要做字節(jié)序的轉(zhuǎn)換。同樣地,接收主機(jī)如果是小端字節(jié)序的,接到16位的源端口號(hào)也要做字節(jié)序的轉(zhuǎn)換。如果主機(jī)是大端字節(jié)序的,發(fā)送和接收都不需要做轉(zhuǎn)換。同理,32位的IP地址也要考慮網(wǎng)絡(luò)字節(jié)序和主機(jī)字節(jié)序的問題。
為使網(wǎng)絡(luò)程序具有可移植性,使同樣的C代碼在大端和小端計(jì)算機(jī)上編譯后都能正常運(yùn)行,可以調(diào)用以下庫函數(shù)做網(wǎng)絡(luò)字節(jié)序和主機(jī)字節(jié)序的轉(zhuǎn)換。
3 函數(shù)介紹
A 依賴的頭文件
#include <arpa/inet.h>
B 函數(shù)聲明
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
h表示host,n表示network,l表示32位長整數(shù),s表示16位短整數(shù)。
如果主機(jī)是小端字節(jié)序,這些函數(shù)將參數(shù)做相應(yīng)的大小端轉(zhuǎn)換然后返回,如果主機(jī)是大端字節(jié)序,這些函數(shù)不做轉(zhuǎn)換,將參數(shù)原封不動(dòng)地返回。
uint32_t htonl(uint32_t hostlong);
名稱: |
htonl |
功能: |
The htonl() function converts the unsigned integer hostlong from host byte order to network byte order |
頭文件: |
#include <arpa/inet.h> |
函數(shù)原形: |
uint32_t htonl(uint32_t hostlong); |
參數(shù): |
|
返回值: |
|
uint16_t htons(uint16_t hostshort);
名稱: |
htons |
功能: |
The htons() function converts the unsigned short integer hostshort from host byte order to network byte order. |
頭文件: |
#include <arpa/inet.h> |
函數(shù)原形: |
uint16_t htons(uint16_t hostshort); |
參數(shù): |
|
返回值: |
|
uint32_t ntohl(uint32_t netlong);
名稱: |
ntohl |
功能: |
The ntohl() function converts the unsigned integer netlong from network byte order to host byte order. |
頭文件: |
#include <arpa/inet.h> |
函數(shù)原形: |
uint32_t ntohl(uint32_t netlong); |
參數(shù): |
生活不易,碼農(nóng)辛苦 如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng) ![]()
------分隔線----------------------------
------分隔線----------------------------
欄目熱點(diǎn)
|