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