socket
socket可以看成是使用者程序與核心網路協議棧的程式設計介面,不僅可以用於本機的程序間通訊,也可以用於網路上不同主機的程序間通訊—而管道只能在同一臺主機進行通訊
應用層依靠socket進行資料傳輸,我們不必關心底層的核心,即底層資料的傳輸細節,只關心套介面的存在。
可以把套介面看成程序間的通訊,主機a上的程序通過套介面傳輸資料到主機b的程序。
struct sockaddr_in;
說明:sin_len:整個sockaddr_in結構體的長度
sin_family:指定該位址家族,在這裡必須設為af_inet – ipv4
sin_port:埠
sin_addr:ipv4位址
sin_zero:暫不使用,一般將其設為0
其中,結構體in_addr:
struct in_addr ;
結構體in_addr用來表示乙個32位的ipv4位址–位元組序為網路位元組序
通用位址結構
通用位址結構用來指定與套接字關聯的位址
struct sockaddr;
可看到:通用位址結構中的da_data有14個位元組和ipv4 sin_port(2位元組)、sin_addr(4位元組)、sin_zero(8位元組)相同,說明這兩個相容,通常,進行tcp/ip程式設計時跟多的是填充ipv4套介面位址結構,然後強制轉換為通用位址結構。
位元組序
1、大端位元組序(big endian)
最高有效位儲存在最低記憶體位址處,最低有效位儲存在最高記憶體位址處
2、小端位元組序(little endian)
最高有效位儲存在最高記憶體位址處,最低有效位儲存在最低記憶體位址處
主機主機序
不同主機有不同的位元組序,如x86位小端位元組序,motorola 6900為大端位元組序,arm位元組序為可配置的
網路位元組序
網路位元組序規定為大端位元組序
為什麼要引入位元組序這個概念?
socket能夠實現異構系統間通訊,不同系統位元組序不同,引入位元組序可實現異構系統通訊
測試主機大小端:
int main()
高位址存高記憶體位址—小端位元組序
位元組序轉換函式
uint32_t htonl(uint32_t hostlong); //將4個位元組的主機位元組序轉換為網路位元組序
uint32_t htons(uint32_t hostshort);//2個位元組的主機位元組序轉換為網路位元組序
uint32_t ntohl(uint32_t netlong); //相反
uint32_t ntohs(uint32_t netshort);
說明:h代表host;n代表network
s代表short;l代表long
int main()
主機位元組序轉換為了網路位元組序(大端位元組序)
in_addr_t inet_addr (const char *cp);
inet_addr將乙個點分十進位制ip位址字串轉換成32位數字表示的ip位址(網路位元組順序)。
char* inet_ntoa (struct in_addr in);
inet_ntoa將乙個32位數字表示的ip位址轉換成點分十進位制ip位址字串。
這兩個函式互為反函式
unsigned char *ip = 「192.168.1.120」;
int int_ip = inet_addr(ip);
printf(「%d\n」, int_ip);
struct in_addr ipaddr ;
ipaddr.s_addr = int_ip;
printf("%s\n", inet_ntoa(ipaddr));
(1)流式套接字 sock_stream — tcp
提供面向連線、可靠的資料傳輸服務,資料按位元組流、按順序收發,保證在傳輸過程中無丟失、無冗餘。tcp協議支援該套接字。
(2)資料報套接字 sock_dgram – udp
提供面向無連線的服務,資料收發無序,不能保證資料的準確到達。udp協議支援該套接字。
(3)原始套接字 sock_raw
允許對低於傳輸層的協議或物理網路直接訪問,例如可以接收和傳送icmp報文。常用於檢測新的協議。
socket程式設計
一直以為serversocket accept之後客戶端才能發資訊,實驗後得出如下結論 1 serversocket沒有accept時,client是可以傳送資訊到server端的。2 serversocket accept之後,正在處理訊息時,client也是可以傳送資訊到server端。如果se...
Socket程式設計
對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...
socket程式設計
建立socket 建立乙個 socket,它可用於在基於 tcp ip 的網路 如 internet 上通訊。socket s new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp 若要使用 udp 而不是 ...