socket 函數 system Call socket 函數原型: 參數adressfamily 舉例 | adress family種類 | 功能描述 | | | | | AF_INET | IPV4用socket | | AF_INET6 | IPV6用socket | | AF_UNIX | ...
socket 函數
system Call socket 函數原型:
int socket(int addressfamily, int type, int protocol);
參數adressfamily 舉例
adress family種類 | 功能描述 |
---|---|
AF_INET | IPV4用socket |
AF_INET6 | IPV6用socket |
AF_UNIX | 本地進程間通信用socket,也叫AF_LOCAL |
AF_PACKET | driver lebel socket的介面 |
參數type 舉例
type 種類 | 功能描述 |
---|---|
SOCK_STREAM | 保證有序,都能到達。雙向的byte stream |
SOCK_DGRAM | 不保證連接,順序,支持data的最大固定長度 |
adressfamily和type的組合,來決定是使用TCP還是UDP協議
- AF_INET+SOCK_STREAM : IPv4+TCP
- AF_INET6+SOCK_STREAM : IPv6+TCP
- AF_INET+SOCK_DGRAM : IPv4+UDP
- AF_INET6+SOCK_DGRAM : IPv6+UDP
SOCK_STREAM和SOCK_DGRAM的比較:
socket種類 | 數據是否一定送達 | 數據到達順序 | 一次送信的數據量的大小 |
---|---|---|---|
SOCK_STREAM | 一定 | 按發送順序 | 沒有大小限制 |
SOCK_DGRAM | 不一定 | 有可能不是發送順序 | 有大小限制 |
參數protocol 在ubuntu下的查看方法:
sudo cat /etc/protocols
socket的本質是linux系統里的文件描述符(file descriptor),就是一個整數值。
linux里標準的文件描述符:
整數值 | 名字 | 說明 |
---|---|---|
0 | stdin | 標準輸入 |
1 | stdout | 標準輸出 |
2 | stderr | 標準錯誤輸出 |
所以判斷socket建立成功與否,就是判斷system call socket的返回值是啥
int sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0){
cout << "socket 建立失敗" << endl;
return -1;
}
註意:不可以用if(sock <= 0)來判斷,=0的時候,也有可能是socket建立成功。下麵代碼socket建立成功了,但是返回值是0.因為提前把stdin關閉了。
int main(){
int sock;
cout << "fileno(stdin): " << fileno(stdin) << endl;
close(0);
sock = socket(AF_INET, SOCK_DGRAM, 0);
cout << sock << endl;
}
當使用一個函數時,但不知道是在哪個.h文件的時候,輸入:
man 函數名字
會得到類似下麵的結果,比如
man socket
再比如
man malloc
從圖片中可以看出:
- 【2】代表system call
- 【3】代表系統庫函數