1. 程式人生 > >socket 函數

socket 函數

圖片 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 函數