1.異構(gòu)環(huán)境下的網(wǎng)絡(luò)編程
不同的平臺以不同的方式存放一個二進(jìn)制。最常見的兩種格式:大數(shù)在前的字節(jié)順序和小數(shù)在前的字節(jié)順序。
大字在前:將一個多字節(jié)數(shù)的高序字節(jié)存儲在內(nèi)存的其實地址。而小數(shù)在前的字節(jié)順序剛好相反。
套接字編程接口(Socket API)提供了4個函數(shù)解決本機與網(wǎng)絡(luò)的字節(jié)順序:
htons():短整數(shù)本機順序轉(zhuǎn)換為網(wǎng)絡(luò)順序,用于端口號。
htonl():長整數(shù)本機順序轉(zhuǎn)換為網(wǎng)絡(luò)順序,用于IP地址。
ntohs():短整數(shù)網(wǎng)絡(luò)順序轉(zhuǎn)換為本機順序,用于端口號。
ntohl():長整數(shù)網(wǎng)絡(luò)順序轉(zhuǎn)換為本機順序,用于IP地址。
點分十進(jìn)制的IP地址的轉(zhuǎn)換:
unsigned long inet_addr(cost char *cp):
cp:點分十進(jìn)制形式的IP地址。
返回值:網(wǎng)絡(luò)字節(jié)序的IP地址,無符號長整數(shù)
char * int_ntoa(struct in_addr in):
in:包含長整數(shù)IP地址的in_addr結(jié)構(gòu)變量。
返回值:點分十進(jìn)制IP地址的字符串指針。
域名服務(wù):
struct hostent * gethodtbyname(const char * name);
name:站點主機域名字符串。
返回值:是指向hostent結(jié)構(gòu)指針
hostent:包含主機名,主機別名數(shù)組、返回地址的類型(一般是AF_INET)
2.阻塞與非阻塞
通信包括阻塞和非阻塞。
在阻塞模式下,利用TCP協(xié)議發(fā)送一個報文時,如果低層協(xié)議沒有可用空間來存放用戶數(shù)據(jù),則應(yīng)用進(jìn)程將阻塞等待直到協(xié)議有可用的空間。而非阻塞模式下調(diào)用將直接返回而不等待。在應(yīng)用進(jìn)程調(diào)用接收函數(shù)接收報文時,如果是在阻塞模式下,若沒有到達(dá)數(shù)據(jù),則調(diào)用將一直阻塞直到有數(shù)據(jù)到達(dá)或者出錯,而非阻塞模式下,將直接返回不等待。
對于UDP協(xié)議而言,由于UDP沒有發(fā)送緩存,因此UDP協(xié)議即使在阻塞模式下也不會發(fā)生阻塞。
3.套接字及類型
socket(套接字)是網(wǎng)絡(luò)通信的基本構(gòu)件,是可以被命名和尋址的通信端點,使用中的每一個套接字都有與其類型和與之相連的進(jìn)程。
TCP/IP的socket提供三種類型的套接字:
*SOCK_STREAM(流式套接字):提供一個面向連接的、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯、無重復(fù)、且按發(fā)送順序接收。內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限。數(shù)據(jù)被看作是字節(jié)流,無長度限制。
*SOCK_DGRAM(數(shù)據(jù)報式套接字):提供一個無連接服務(wù)。數(shù)據(jù)報以獨立包形式被發(fā)送,不提供無錯保證。
*SOCK_RAW(原始套接字):該接口允許比較低層協(xié)議。