socket 函數
阿新 • • 發佈:2018-10-06
圖片 ade n) 裏的 也有 ipv6 順序 輸入 描述
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】代表系統庫函數
c/c++ 學習互助QQ群:877684253
本人微信:xiaoshitou5854
socket 函數