日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux网络编程 华清,Linux网络编程之套接字

發布時間:2024/8/23 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux网络编程 华清,Linux网络编程之套接字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 :套接字屬性

套接字由域(domain),類型(type)和協議(protocol)三個屬性確定其特性。

1)套接字的域

域指定套接字通信中使用的網絡 介質,常見的套接字域是AF_INET,它指的是互聯網絡,許多LINUX局域網使用的都是該網絡。

服務器上可能同時有多個服務正在運行,客戶可以通過IP端口來指定一臺聯網機器上的某個特定服務。在系統內部,端口通過分配一個唯一的16位整數來標識,在系統外部,則需要通過IP地址和端口號的組合來確定。套接字作為通信的終點,它必須在開始通信之前綁定一個端口。

服務器在特定的端口等待客戶的連接,知名服務器所分配的端口號在所有LINUX和UNIX機器上都是一樣的,它們通常(但并不總是如此)小于1024,一般情況下,小于1024的端口號都是為系統服務保留的,并且所服務的進程必須具有超級用戶權限。

其它可以使用的域如AF_UNIX,AF_ISO,AF_XFA等。

2)套接字類型

套接字有三種類型:流式套接字(SOCK_STREAM),數據報套接字(SOCK_DGRAM)及原始套接字。

1、流式套接字(SOCK_STREAM)

流式套接字提供的是一個有序,可靠,雙向字節流的連接。因此,發送的數據可以確保不會丟失,復制或亂序到達,并且在這一過程 中發生的錯誤也不會顯示出來。流式套接字由類型SOCK_STREAM指定,它們是地AF_INET域中通過TCP/IP連接來實現的,它們也是AF_UNIX域中常用的套接字類型。

2、數據報套接字(SOCK_DGRAM)

與此相反 ,由SOCK_DGRAM指定的數據報套接字不建立和維持一個連接,它尋可以發送的數據報的長度有限制。數據報作為一個單獨的網絡消息被傳輸,它可能會丟失,復制或亂序到達。數據報套接字是在AF_INET域中通過UDP/IP連接來實現的,它提供的是一種無序的不可靠服務,但從資源的角度來看,相對來說它們開銷比較小,因為不需要維持網絡連接,而且因為無需花費時間來建立連接,它們的速度也很快。

3、原始套接字

二 :套接字協議

只要底層傳輸機制允許不止一個協議來提供所要求的套接字類型,就可以為套接字選擇一個特定的協議。我們重點討論UNIX網絡套接字和文件系統套接字,它們不需要你 選擇一個特定的協議,只需要使用其默認值即可。

三 :創建套接字

socket系統調用創建一個套接字并返回一個描述符,該描述符可以用來訪問該套接字。

#include < sys/types.h>

#include < sys/socket.h>

socket函數原型為:

int socket(int domain, int type, int protocol);

domain參數指定socket的類型,一般為AF_INET,type可以是SOCK_STREAM 或SOCK_DGRAM,分別表示TCP連接和UDP連接;protocol通常賦值"0"。Socket()調用返回一個整型socket描述符,你可 以在后面的調用使用它。

一旦通過socket調用返回一個socket描述符,你應該將該socket與你本機上的一個端口相關聯(往往當你在設計服務器端程序時需要調用該函數。隨后你就可以在該端口監聽服務請求;而客戶端一般無須調用該函數)。

五:套接字地址

每個套接字域都有其自己的地址格式。對于AF_INET域來說,套接字地址由結構sockaddr_in來指定,該結構在頭文件netinet/in.h中定義。

我們要討論的第一個結構類型是:struct sockaddr,該類型是用來保存socket信息的:

struct sockaddr

{

unsigned short sa_family; /* 地址族, AF_xxx */

char sa_data[14]; /* 14 字節的協議地址 */

};

sa_family一般為AF_INET;sa_data則包含該socket的IP地址和端口號。

另外還有一種結構類型:

struct sockaddr_in

{

short int sin_ family; /* 地址族 */

unsigned short int sin_port; /* 端口號 */

struct in_addr sin_addr; /* IP地址 */

unsigned char sin_zero[8]; /* 填充0 以保持與struct sockaddr同樣大小 */

};

這個結構使用更為方便。sin_zero(它用來將sockaddr_in結構填充到與struct sockaddr同樣的長度)應該用bzero()或memset()函數將其置為零。指向sockaddr_in 的指針和指向sockaddr的指針可以相互轉換,這意味著如果一個函數所需參數類型是sockaddr時,你可以在函數調用的時候將一個指向 sockaddr_in的指針轉換為指向sockaddr的指針;或者相反。sin_family通常被賦AF_INET;sin_port和 sin_addr應該轉換成為網絡字節優先順序 。

IP地址結構struct in_addr被定義為:

struct in_addr

unsigned long int s_addr;

};

IP地址中的四個字節組成一個32位的值。

這是幾個字節順序轉換函數:

htons()--"Host to Network Short" ; htonl()--"Host to Network Long"

ntohs()--"Network to Host Short" ; ntohl()--"Network to Host Long"

在這里,h表示"host" ,n表示"network",s 表示"short",l表示 "long"。

總結

以上是生活随笔為你收集整理的linux网络编程 华清,Linux网络编程之套接字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。